Java的IO流是编程中不可或缺的一部分,主要用于数据的输入和输出操作。在Java中,流(Stream)是一个抽象的概念,它代表了一个数据序列,可以是从硬盘、内存、键盘读取数据,也可以向这些地方写入数据。流的机制使得开发者能够灵活地控制数据的流向。
IO流主要分为两大类:字节流(Byte Stream)和字符流(Character Stream)。字节流处理的是8位的字节数据,适用于任何类型的数据,包括图片、音频、视频等非文本文件。而字符流则是针对文本数据设计的,它内部会处理字符编码问题,如UTF-8、GBK等。字符流又细分为Reader和Writer两个基本类,分别用于读取和写入字符。
1. 字节流:
- 输入流:InputStream(如 FileInputStream)
- 输出流:OutputStream(如 FileOutputStream)
2. 字符流:
- 输入流:Reader(如 InputStreamReader,FileReader)
- 输出流:Writer(如 OutputStreamWriter,FileWriter)
Reader和Writer类是字符流的基类,它们提供了基本的读写方法。例如,Reader的`read()`方法可以读取一个字符,`read(char[])`方法可以读取字符到指定数组中。而Writer类提供了`write()`方法来写入单个字符或字符数组,以及`flush()`方法用来刷新流,确保数据被写出。
FileReader和FileWriter是专门处理文件的字符流,它们可以直接与文件关联。FileReader在构造时需要指定文件路径,如果文件不存在会抛出FileNotFoundException。FileWriter同样需要指定文件路径,如果文件已存在,默认会覆盖原有内容;如果第二个构造参数为true,将会追加数据到文件末尾。
以下是一个使用FileWriter写入文本数据到文件的示例:
```java
private static void test1() {
FileWriter fw = null;
try {
// 初始化FileWriter对象,指定文件名和存储路径
fw = new FileWriter("D:/test.txt");
fw.write("将字符串写入流 ");
// 将流中的数据刷新到目的地
fw.flush();
fw.write("将字符串写入流 ");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null) {
try {
// 关闭流,释放资源,之前先调用flush()
fw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
```
在实际编程中,我们通常会结合使用字节流和字符流。例如,如果需要处理的文件是文本格式,使用字符流更方便,因为它能自动处理字符编码。而对于非文本文件,如图像或音频,应该使用字节流。此外,Java NIO(New IO)提供了一种更高效、更灵活的IO操作方式,可以替代传统的IO流,尤其是在处理大量数据时。理解并熟练掌握IO流是Java开发人员必备的技能之一。