Java I/O 简介
Java I/O(输入/输出)是 Java 提供的一套用于读写数据的API,主要包括文件、网络、控制台等数据的输入和输出操作。Java I/O体系结构包括了不同的类和接口,使得开发者便捷地处理字节流和字符流、文件操作、数据流以及对象流等。
1. Java I/O 分类
1.1 字节流(Byte Streams)
字节流用于处理所有类型的I/O,包括图像、音频和视频等二进制数据,以字节为单位进行读写。字节流的基本输入输出类有:
-
InputStream:所有字节输入流的超类。
FileInputStream
:从文件中读取字节流。BufferedInputStream
:提供缓冲区的输入流,提高读取效率。DataInputStream
:允许应用程序以机器无关的方式从底层输入流中读取基本 Java 数据类型。
-
OutputStream:所有字节输出流的超类。
FileOutputStream
:向文件中写入字节流。BufferedOutputStream
:提供缓冲区的输出流,增加写入效率。DataOutputStream
:允许应用程序将基本 Java 数据类型写入输出流。
1.2 字符流(Character Streams)
字符流是专门用于处理字符的输入和输出操作,它基于 Unicode 编码,适合文本数据的处理,以字符为单位进行数据的读写。字符流的基本输入输出类有:
-
Reader:所有字符输入流的超类。
FileReader
:从文件中读取字符流。BufferedReader
:提供缓冲区的输入流,用于高效地读取字符。InputStreamReader
:将字节流转换为字符流。
-
Writer:所有字符输出流的超类。
FileWriter
:向文件中写入字符流。BufferedWriter
:提供缓冲区的输出流,提高字符写入效率。PrintWriter
:支持格式化输出的字符流。
2. Java I/O 核心类
2.1 文件操作类
-
File
:用于表示文件或目录,提供了文件的创建、删除、重命名、判断文件是否存在等方法。示例:
File file = new File("example.txt"); if (!file.exists()) { file.createNewFile(); }
2.2 缓冲流类
缓冲流用于提高数据的读取和写入效率。它通过内部缓冲区减少了多次读写操作。
BufferedReader
:字符流的缓冲区输入流。BufferedWriter
:字符流的缓冲区输出流。BufferedInputStream
:字节流的缓冲区输入流。BufferedOutputStream
:字节流的缓冲区输出流。
2.3 数据流类
数据流用于处理原始数据类型(如 int
、double
)和字符串等数据的输入和输出。通过 DataInputStream
和 DataOutputStream
可以以平台无关的方式读取和写入这些数据。
DataInputStream
:用于读取原始数据类型。DataOutputStream
:用于写入原始数据类型。
2.4 对象流类
Java 提供了对对象的输入输出支持,可以将对象序列化(转化为字节流)和反序列化(从字节流恢复对象)。
ObjectInputStream
:用于读取对象。ObjectOutputStream
:用于写入对象。
3. Java NIO(New I/O)
Java NIO(New I/O)是一个更高效、更灵活的I/O库,主要特点是基于缓冲区和通道(Channel)进行I/O操作,能够处理更大规模的数据,并且支持异步 I/O 操作。与传统的 Java I/O 不同,NIO 采用了基于事件驱动的模型,支持非阻塞 I/O 操作和多路复用。
3.1 NIO 核心组件
- Buffer:数据的容器,用于与通道进行数据交互。
- Channel:用于读写数据的通道。常用的通道包括
FileChannel
和SocketChannel
。 - Selector:用于多路复用,允许单一线程处理多个通道。
4. 常见的I/O操作
4.1 读取文件
-
使用字节流:
FileInputStream fis = new FileInputStream("example.txt"); int byteData; while ((byteData = fis.read()) != -1) { System.out.print((char) byteData); } fis.close();
-
使用字符流:
FileReader fr = new FileReader("example.txt"); int charData; while ((charData = fr.read()