Java的输入输出(I/O)系统是编程中不可或缺的一部分,主要负责数据的传输,包括从一个源头(如键盘、文件、网络连接)读取数据和向目的地(如显示器、文件、网络连接)写入数据。Java的I/O库在`java.io`包中,提供了丰富的类和接口来支持各种类型的流操作。
### I/O流概述
I/O流是Java对输入输出数据流的一种抽象,分为输入流(Input Stream)和输出流(Output Stream)。输入流是从数据源读取数据,输出流则是向目标写入数据。流可以双向流动,例如,文件既可以作为输入流读取数据,也可以作为输出流写入数据。Java中的I/O流分为字节流(Byte Stream)和字符流(Character Stream)两大类,分别处理以字节为单位和以字符为单位的数据。
字节流的基类是`InputStream`和`OutputStream`,字符流的基类是`Reader`和`Writer`。这些基类提供了基本的读写方法,如`read()`和`write()`。
### 字节流
- `InputStream`:所有字节输入流的父类,提供读取单个字节、跳过指定字节数、关闭流等方法。
- 子类:`FileInputStream`、`ByteArrayInputStream`、`FilterInputStream`(如`BufferedInputStream`、`DataInputStream`)等。
- `OutputStream`:所有字节输出流的父类,提供写入单个字节、跳过指定字节数、关闭流等方法。
- 子类:`FileOutputStream`、`ByteArrayOutputStream`、`FilterOutputStream`(如`BufferedOutputStream`、`DataOutputStream`)等。
### 字符流
- `Reader`:所有字符输入流的父类,用于处理Unicode字符数据。
- 子类:`BufferedReader`、`LineNumberReader`、`CharArrayReader`、`FilterReader`(如`PushbackReader`、`InputStreamReader`、`FileReader`)等。
- `Writer`:所有字符输出流的父类,用于写出Unicode字符数据。
- 子类:`BufferedWriter`、`CharArrayWriter`、`FilterWriter`(如`OutputStreamWriter`、`FileWriter`、`PrintWriter`)等。
### 特殊流
- **标准流**:`System.in`、`System.out`和`System.err`分别代表标准输入、标准输出和标准错误流。
- **过滤流**:如`BufferedInputStream`和`BufferedReader`,用于提高读写效率,增加缓冲区。
- **对象流**:`ObjectInputStream`和`ObjectOutputStream`,用于序列化和反序列化对象。
- **文件操作/随机访问文件**:`RandomAccessFile`允许对文件进行随机读写。
- **管道流**:`PipedInputStream`和`PipedOutputStream`用于线程间通信。
- **内存读写流**:`ByteArrayInputStream`和`ByteArrayOutputStream`,可以直接在内存中读写字节。
- **顺序输入流**:未提供具体定义,可能是指按照特定顺序读写的流。
### I/O接口与文件操作
- `DataInput`和`DataOutput`接口用于处理基本数据类型和字符串的读写。
- `ObjectInput`和`ObjectOutput`接口处理对象的序列化和反序列化。
- `FileFilter`和`FilenameFilter`用于文件和目录的过滤。
- `Serializable`和`Externalizable`接口标记类可以被序列化。
- `File`类是文件和目录的抽象表示。
- `FileDescriptor`代表操作系统内部的文件描述符。
- `RandomAccessFile`提供对文件的随机访问能力。
Java的I/O系统通过这些类和接口,可以灵活地处理各种输入输出场景,从简单的文件读写到复杂的网络通信和对象序列化。理解并熟练掌握这一系统,是成为高效Java开发者的关键之一。