Java FileInputStream和FileOutputStream字节流详解(附带实例)
字节流的处理单位是字节,通常用来处理二进制文件,如音频、图片文件等。
实际上,所有的文件都能以二进制(字节)形式存在。Java 的 I/O 针对字节传输操作提供了一系列流,统称为字节流。
InputStream 提供了一系列和读取数据有关的方法,如下表所示:
用 OutputStream 类描述所有字节输出流的抽象概念。它是一个抽象类,所以不能被实例化。
OutputStream 提供了一系列和写入数据有关的方法,如下表所示:
通过它的构造函数指定文件路径和文件名,使用 FileInputStream 可以读取文件的一个字节、几个字节或整个文件。创建 FileInputStream 实例对象时,指定的文件应当是存在和可读的,否则在进行读取操作的时候就会抛出异常。
FileInputStream 类的构造方法有两种:
接下来通过一个例子演示如何从文件中读取数据。
【实例】通过输入流从文件“d:\a.txt”中读取内容,并在控制台输出。
FileOutputStream 类的构造方法有两种:
下面通过一个例子演示如何向文件中写入数据。
【实例】向文件中写入数据。通过输出流把字节数组中的数据写入指定的文件中。如果成功,在控制台输出相应提示信息。
在 try-with-exceptions 语句块中,调用 write() 方法将数据写入文件。如果发生任何 I/O 错误,将会抛出 IOException,需要捕获并处理这个异常。需要注意,如果 filePath 指定的文件已经存在,则原有内容会被覆盖,否则,会创建一个新文件进行写入。
程序执行结果为:
实际上,所有的文件都能以二进制(字节)形式存在。Java 的 I/O 针对字节传输操作提供了一系列流,统称为字节流。
Java InputStream和OutputStream
在 Java 中,用 InputStream 类描述所有字节输入流的抽象概念。它是一个抽象类,所以不能通过 new InputStream() 方法实例化对象。InputStream 提供了一系列和读取数据有关的方法,如下表所示:
方法 | 说明 |
---|---|
int available() | 从输入流返回可读的字节数 |
void close() | 关闭此输入流并释放与该流关联的所有系统资源 |
void mark(int readlimit) | 在此输入流中标记当前的位置。readlimit 参数告知此输入流在标记位置失效之前允许读取的字节数 |
boolean markSupported() | 测试此输入流是否支持 mark 和 reset 方法 |
abstract int read() | 从输入流中读取数据的下一个字节 |
int read(byte[] b) | 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中 |
int read(byte[] b, int off, int len) | 将输入流中最多 len 个数据字节读入 byte 数组 |
void reset() | 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置 |
long skip(long n) | 跳过和丢弃此输入流中数据的n个字节 |
用 OutputStream 类描述所有字节输出流的抽象概念。它是一个抽象类,所以不能被实例化。
OutputStream 提供了一系列和写入数据有关的方法,如下表所示:
方法 | 方法说明 |
---|---|
void close() | 关闭此输出流并释放与此流有关的所有系统资源 |
void flush() | 刷新此输出流并强制写出所有缓冲的输出字节 |
void write(byte[] b) | 将 b.length 个字节从指定的 byte 数组写入此输出流 |
void write(byte[] b, int off, int len) | 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流 |
abstract void write(int b) | 将指定的字节写入此输出流 |
Java FileInputStream和FileOutputStream
FileInputStream 和 FileOutputStream 类从磁盘文件读和写数据。1) FileInputStream
FileInputStream 用来从文件中读取数据,操作的单位是字节,不但可以读写文本文件,也可以读写图片、声音、影像文件。这种特点非常有用,可以把这种文件变成流,然后在网络上传输。通过它的构造函数指定文件路径和文件名,使用 FileInputStream 可以读取文件的一个字节、几个字节或整个文件。创建 FileInputStream 实例对象时,指定的文件应当是存在和可读的,否则在进行读取操作的时候就会抛出异常。
FileInputStream 类的构造方法有两种:
- FileInputStream(String filename):用文件名作为参数创建文件输入流对象,这里的 filename 包含文件路径信息;
- FileInputStream(File f):用一个 File 对象作为参数来指出流的源端。
接下来通过一个例子演示如何从文件中读取数据。
【实例】通过输入流从文件“d:\a.txt”中读取内容,并在控制台输出。
import java.io.*; public class FileInputStreamDemo { public static void main(String[] args) { int num; byte[] dat = new byte[20]; try { // 创建文件输入流类对象,“d:\a.txt”作为输入流的源 FileInputStream in = new FileInputStream("d:\\a.txt"); // a.txt" // 从输入流中读取字节数据放入字节数组dat中,每次最多读取 20 个字节 while ((num = in.read(dat, 0, 20)) != -1) { // 把字节数组转换成字符串 String s = new String(dat, 0, num); System.out.print(s); } in.close(); // 关闭输入流 } catch (IOException e) { System.out.println("读文件错误!错误原因:" + e); } } }程序执行结果为:
read file
hello world
2) FileOutputStream
FileOutputStream 是与 FileInputStream 相对应的文件输出流类,用来实现向文件中写入数据,写入数据的基本单位是字节。FileOutputStream 类的构造方法有两种:
- FileOutputStream(String filename):用文件名作为参数创建文件输出流对象,这里的 filename 包含文件路径信息。
- FileOutputStream(File f):用一个 File 对象作为参数来指出流的目的地。
下面通过一个例子演示如何向文件中写入数据。
【实例】向文件中写入数据。通过输出流把字节数组中的数据写入指定的文件中。如果成功,在控制台输出相应提示信息。
import java.io.*; public class FileOutputStreamDemo { public static void main(String[] args) { String filePath = "d://out.txt"; byte[] data = "Hello, World!".getBytes(); try (FileOutputStream fos = new FileOutputStream(filePath)) { fos.write(data); System.out.println("Data written to file successfully."); } catch (IOException e) { e.printStackTrace(); } } }在此例中,首先定义要写入的文件路径 filePath 和要写入的数据 data。然后,使用 FileOutputStream 的构造函数创建一个新的 FileOutputStream 实例,用于写入文件。
在 try-with-exceptions 语句块中,调用 write() 方法将数据写入文件。如果发生任何 I/O 错误,将会抛出 IOException,需要捕获并处理这个异常。需要注意,如果 filePath 指定的文件已经存在,则原有内容会被覆盖,否则,会创建一个新文件进行写入。
程序执行结果为:
Data written to file successfully.
同时会在文件“d:\out.txt”中写入“Hello World”。