Java I/O(输入/输出)是Java编程中非常重要的部分,用于处理数据的读取和写入操作。以下是一些常见的Java I/O知识点:
1. Java I/O体系结构
Java I/O主要分为两大类:
- 字节流(Byte Stream):以字节为单位进行数据处理,适用于处理二进制数据,如文件、图片等。主要类包括
InputStream
和OutputStream
。
- 字符流(Character Stream):以字符为单位进行数据处理,适用于处理文本数据。主要类包括
Reader
和Writer
。
两者之间的关系是:字符流在底层会使用字节流来实现,但会根据指定的字符集(如UTF-8)进行编码和解码。
2. 常见的I/O类和接口
字节流:
InputStream
:字节输入流的抽象基类,所有字节输入流都继承自它。
OutputStream
:字节输出流的抽象基类,所有字节输出流都继承自它。
FileInputStream
:用于从文件中读取字节数据。
FileOutputStream
:用于向文件中写入字节数据。
BufferedInputStream
和 BufferedOutputStream
:带缓冲功能的字节流,可以提高读写效率。
DataInputStream
和 DataOutputStream
:用于读写基本数据类型(如int、double等)的字节流。
字符流:
Reader
:字符输入流的抽象基类。
Writer
:字符输出流的抽象基类。
FileReader
:用于从文件中读取字符数据。
FileWriter
:用于向文件中写入字符数据。
BufferedReader
和 BufferedWriter
:带缓冲功能的字符流,支持按行读取和高效写入。
InputStreamReader
和 OutputStreamWriter
:用于在字节流和字符流之间进行转换。
3. 文件操作
File
类:用于表示文件或目录的路径名,可以获取文件信息(如大小、路径、是否存在等),也可以创建、删除文件或目录。
- 文件路径:Java支持绝对路径和相对路径。
- 文件分隔符:在Windows系统中是
\
,在Linux/Unix系统中是/
。可以通过File.separator
获取系统默认的分隔符。
4. 缓冲流
- 缓冲流的作用:减少磁盘I/O操作的次数,提高读写效率。
BufferedInputStream
和 BufferedOutputStream
:字节缓冲流,内部维护一个缓冲区。
BufferedReader
和 BufferedWriter
:字符缓冲流,支持按行读取和高效写入。
5. 序列化与反序列化
- 序列化:将对象转换为字节序列的过程,便于存储或传输。
- 反序列化:将字节序列还原为对象的过程。
Serializable
接口:需要序列化的类必须实现此接口。
ObjectOutputStream
和 ObjectInputStream
:用于序列化和反序列化对象。
6. I/O异常处理
IOException
:I/O操作中可能抛出的异常,如文件不存在、磁盘空间不足等。
FileNotFoundException
:文件未找到异常,继承自IOException
。
- 异常处理:通常使用
try-catch
块捕获异常,或者使用try-with-resources
语句自动关闭资源。
7. 其他常用类
PrintStream
和 PrintWriter
:用于格式化输出,支持打印多种类型的数据。
RandomAccessFile
:支持随机访问文件,可以读写文件的任意位置。
Scanner
:用于从控制台或文件中读取输入,支持按行或按分隔符读取。
8. NIO(New I/O)
- NIO是Java 1.4引入的,是对传统I/O的补充,提供了非阻塞I/O操作、内存映射文件I/O、通道(Channel)和缓冲区(Buffer)等特性。
Channel
:用于在缓冲区和实体(如文件、网络连接)之间传输数据。
Buffer
:用于存储数据的容器,如ByteBuffer
、CharBuffer
等。
Files
类:提供了大量静态方法,用于操作文件和目录,如复制、移动、删除等。
9. 常见面试题
- 如何选择使用字节流还是字符流?
- 如果处理的是文本数据,优先使用字符流;如果是二进制数据,使用字节流。
- 如何避免I/O资源泄漏?
- 使用
try-with-resources
语句,确保资源在使用后自动关闭。
- 什么是序列化?哪些类可以被序列化?
- 序列化是将对象转换为字节序列的过程。需要序列化的类必须实现
Serializable
接口。
这些是Java I/O中常见的知识点,掌握它们可以帮助你更好地处理文件、网络通信等场景下的输入输出操作。