首页 > 编程笔记 > Java笔记 阅读:92

Java FileInputStream和FileOutputStream字节流详解(附带实例)

字节流的处理单位是字节,通常用来处理二进制文件,如音频、图片文件等。

实际上,所有的文件都能以二进制(字节)形式存在。Java 的 I/O 针对字节传输操作提供了一系列流,统称为字节流。

Java InputStream和OutputStream

在 Java 中,用 InputStream 类描述所有字节输入流的抽象概念。它是一个抽象类,所以不能通过 new InputStream() 方法实例化对象。

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 提供了一系列和写入数据有关的方法,如下表所示:

表: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 类的构造方法有两种:
接下来通过一个例子演示如何从文件中读取数据。

【实例】通过输入流从文件“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 类的构造方法有两种:
下面通过一个例子演示如何向文件中写入数据。

【实例】向文件中写入数据。通过输出流把字节数组中的数据写入指定的文件中。如果成功,在控制台输出相应提示信息。
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”。

相关文章