浅谈Java的输入输出流(Java输入输出流详解:入门到进阶指南)
原创
一、Java输入输出流概述
Java的输入输出流(Input/Output Streams)是Java I/O(Input/Output)库的核心部分,用于处理数据的读取和写入。Java提供了丰盈的输入输出流类,以拥护不同类型的数据处理需求。流(Stream)是一个抽象的概念,代表了一系列有序的数据元素,这些数据元素可以是字节、字符等。
二、Java输入输出流分类
Java输入输出流核心分为以下四类:
- 字节流(Byte Streams)
- 字符流(Character Streams)
- 文件流(File Streams)
- 对象流(Object Streams)
三、字节流
字节流是处理字节数据的流,核心用于处理二进制数据。Java提供了以下两个抽象类作为字节流的基类:
InputStream
:输入字节流的抽象类,提供了读取字节数据的方法。OutputStream
:输出字节流的抽象类,提供了写入字节数据的方法。
3.1 InputStream类
InputStream
类有以下常用方法:
int read(); // 读取一个字节的数据,返回读取的字节值,如果到达流的末尾,则返回-1
int read(byte[] b); // 读取b.length个字节的数据到数组b中,返回实际读取的字节数
int read(byte[] b, int off, int len); // 从数组b的off位置起初读取len个字节的数据,返回实际读取的字节数
long skip(long n); // 跳过n个字节,返回实际跳过的字节数
int available(); // 返回此输入流中可读取的字节数
void close(); // 关闭此输入流并释放与其相关的资源
3.2 OutputStream类
OutputStream
类有以下常用方法:
void write(int b); // 将一个字节写入输出流
void write(byte[] b); // 将数组b中的所有字节写入输出流
void write(byte[] b, int off, int len); // 将数组b中从off位置起初的len个字节写入输出流
void flush(); // 清空输出流,并强制将所有缓冲的输出字节写入输出流
void close(); // 关闭输出流并释放与其相关的资源
四、字符流
字符流是处理字符数据的流,核心用于处理文本数据。Java提供了以下两个抽象类作为字符流的基类:
Reader
:输入字符流的抽象类,提供了读取字符数据的方法。Writer
:输出字符流的抽象类,提供了写入字符数据的方法。
4.1 Reader类
Reader
类有以下常用方法:
int read(); // 读取一个字符的数据,返回读取的字符值,如果到达流的末尾,则返回-1
int read(char[] cbuf); // 读取cbuf.length个字符的数据到数组cbuf中,返回实际读取的字符数
int read(char[] cbuf, int off, int len); // 从数组cbuf的off位置起初读取len个字符的数据,返回实际读取的字符数
void close(); // 关闭此输入流并释放与其相关的资源
4.2 Writer类
Writer
类有以下常用方法:
void write(int c); // 将一个字符写入输出流
void write(char[] cbuf); // 将数组cbuf中的所有字符写入输出流
void write(char[] cbuf, int off, int len); // 将数组cbuf中从off位置起初的len个字符写入输出流
void write(String str); // 将字符串str中的字符写入输出流
void write(String str, int off, int len); // 将字符串str中从off位置起初的len个字符写入输出流
void flush(); // 清空输出流,并强制将所有缓冲的输出字符写入输出流
void close(); // 关闭输出流并释放与其相关的资源
五、文件流
文件流是用于处理文件输入输出的流,Java提供了以下两个类:
FileInputStream
:文件输入流,用于从文件中读取字节。FileOutputStream
:文件输出流,用于向文件写入字节。
5.1 FileInputStream类
FileInputStream
类是InputStream
的子类,以下是一个简洁的使用示例:
FileInputStream fis = new FileInputStream("example.txt");
int b;
while ((b = fis.read()) != -1) {
System.out.print((char) b);
}
fis.close();
5.2 FileOutputStream类
FileOutputStream
类是OutputStream
的子类,以下是一个简洁的使用示例:
FileOutputStream fos = new FileOutputStream("example.txt");
fos.write('A');
fos.write('B');
fos.write('C');
fos.close();
六、对象流
对象流是用于处理对象序列化和反序列化的流,Java提供了以下两个类:
ObjectInputStream
:对象输入流,用于从流中读取对象。ObjectOutputStream
:对象输出流,用于向流中写入对象。
6.1 ObjectInputStream类
ObjectInputStream
类是InputStream
的子类,以下是一个简洁的使用示例:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("example.ser"));
Object obj = ois.readObject();
ois.close();
6.2 ObjectOutputStream类
ObjectOutputStream
类是OutputStream
的子类,以下是一个简洁的使用示例:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("example.ser"));
oos.writeObject(new MyClass());
oos.close();
七、进阶:过滤器流和管道流
过滤器流(Filter Streams)和管道流(Pipe Streams)是Java I/O库中的高级特性,它们提供了一些额外的功能,如数据缓冲、数据转换等。
7.1 过滤器流
过滤器流是包装其他流的流,它们可以提供数据处理的附加功能。以下是一些常用的过滤器流:
BufferedInputStream
:为输入字节流提供缓冲功能。BufferedOutputStream
:为输出字节流提供缓冲功能。BufferedReader
:为输入字符流提供缓冲功能。BufferedWriter
:为输出字符流提供缓冲功能。
7.2 管道流
管道流用于连接两个线程之间的数据传输。以下是一些常用的管道流:
PipedInputStream
:管道输入流,用于读取管道中的数据。PipedOutputStream
:管道输出流,用于向管道写入数据。
八、总结
Java的输入输出流是Java I/O库的核心部分,提供了丰盈的流类以拥护不同类型的数据处理需求。通过懂得字节流、字符流、文件流和对象流的概念和用法,可以更好地处理Java程序中的数据读写。此外,过滤器流和管道流等高级特性可以进一步扩展Java I/O的功能,减成本时间程序的效能和灵活性。