IO流详解——FileInputStream字节输入流

384 阅读3分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍FileInputStream字节输入流的基本概念和使用。

在学习FileInputStream之前,我们先来总述一下IO流我们都需要学习哪几个类。

IO流概述

流可以理解为数据的序列,有起点和终点。从磁盘读取文件到程序是输入流,把数据从程序写入磁盘属于输出流(不仅限于磁盘,只是为了方便理解)。

根据流的不同性质对流有不同的划分。

  • 根据流的不同流向分为:输入流和输出流。
  • 根据处理的数据类型不同分为:字节流和字符流。

下面我们就先开始学习字节输入流。

1. FileInputStream使用字节流读取文件

1.1 什么是FileInputStream

FileInputStream是java.io包下的InputStream的子类,用于读取文件。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,优先使用 FileReader

1.2 FileInputStream的构造方法

FileInputStream(File file) 
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。  
FileInputStream(String name) 
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。 

参数解释:

  • FIle file:文件对象
  • String name:文件具体路径

【实例展示】:

FileInputStream fileInputStream = new FileInputStream(new File("Study01\src\main\java\FileDemo\1.txt"));
FileInputStream fileInputStream1 = new FileInputStream("Study01\src\main\java\FileDemo\1.txt");

1.3 FileInputStream的常用方法

 int read() 
          从此输入流中读取一个数据字节。 
 int read(byte[] b) 
          读入一个数组长度 
 int read(byte[] b, int off, int len) 
          从此输入流中从off开始,将最多 len 个字节的数据读入一个 byte 数组中。 
 long skip(long n) 
          从输入流中跳过并丢弃 n 个字节的数据。 
 void close() 
          关闭此文件输入流并释放与此流有关的所有系统资源。 

继承自InputStream的方法:

 void mark(int readlimit) 
          在此输入流中标记当前的位置。 
 void reset() 
          将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。 

这里主要描述read方法的使用。

首先来看这个文件中只有三个字母,我们来对它进行读取。

image-20211217102229897

  1. 一个一个读:

    System.out.println(fileInputStream.read());
    System.out.println(fileInputStream.read());
    System.out.println(fileInputStream.read());
    System.out.println(fileInputStream.read());
    

image-20211217102304147

发现读到文件结尾返回的是-1,所以我们可以使用循环来代替。

int b=0;
while((b=fileInputStream.read())!=-1){
    System.out.println(b);
}

image-20211217102529787 这里使用变量是为了来接收读取到的数据。

  1. 多个字节一起读:

    byte[] bytes = new byte[1024];
    int len=0;
    while((len=fileInputStream.read(bytes))!=-1){
        System.out.println(len);
        System.out.println(new String(bytes,0,len));
    }
    

image-20211217103344029 这里使用变量len是为了得到最后的数据长度,防止最后数据不够数组长度,导致得不到正确的结果。

1.4 FileInputStream小结

FileInputStream使用步骤:

  1. 创建FileInputStream流对象。
  2. 使用read方法循环读取文件。
  3. 关闭流资源。

小结

以上就是我对于IO流的概述和分类以及对FileInputStream字节输入流的一些浅见,希望对读者有所帮助,如有不正之处,欢迎掘友们留言指正。