"Java学习笔记-IO篇,涵盖了流的分类和字符流、字节流的相关知识,包括基本概念、关系以及使用示例"
在Java编程中,输入/输出(Input/Output,简称IO)是处理数据传输的核心部分。本笔记主要关注Java中的流(Stream)概念,它是数据在内存和外部存储器之间移动的抽象表示。流分为两种主要类型:字节流和字符流。
字节流是Java IO的基础,用于处理任何类型的原始字节数据。字节流有两类基类:`InputStream`和`OutputStream`,分别用于读取和写入数据。`InputStream`是所有输入字节流的父类,而`OutputStream`是所有输出字节流的父类。常见的字节流实现包括`FileInputStream`和`FileOutputStream`,用于读写文件。
字符流则专门处理字符数据,它基于Unicode编码,提供了一种更高效、更方便的方式处理文本数据。字符流的基类是`Reader`和`Writer`,分别用于读取和写入字符。字符流与字节流之间的关系在于,字符流实质上是对字节流的包装,它内部会使用系统默认的编码表(可以通过`System.getProperties()`获取)将字节数据转化为字符数据。
Java的字符流继承体系如下:
- `Reader`
- `OutputStreamReader` - 字节流到字符流的桥梁,可以指定编码
- `FileReader` - 直接从文件读取字符,使用系统默认编码
- `Writer`
- `OutputStreamWriter` - 字符流到字节流的桥梁,可以指定编码
- `FileWriter` - 直接向文件写入字符,使用系统默认编码
- `BufferedReader` - 提供缓冲功能,增强了`FileReader`,支持`readLine()`方法
- `LineNumberReader` - 在`BufferedReader`基础上增加行号功能
- `BufferedWriter` - 提供缓冲功能,增强了`FileWriter`
在使用字符流时,例如`FileWriter`,可以使用以下方式写入数据:
```java
FileWriter fw = new FileWriter("c:\\demo.txt"); // 创建或覆盖文件
fw.write("heshiwei"); // 写入字符串,实际写入的是缓冲区
fw.flush(); // 刷新缓冲区,将数据写入文件
fw.close(); // 关闭文件,自动调用flush()
```
读取数据通常使用`FileReader`,例如:
```java
FileReader fr = new FileReader("c:\\demo.txt");
int res = 0;
while ((res = fr.read()) != -1) { // 读取单个字符,循环直到文件末尾
// 处理读取到的字符
}
fr.close(); // 关闭文件
```
这些基础的IO操作是Java程序员必须掌握的技能,它们在处理文件、网络数据传输、配置文件读写等场景中发挥着重要作用。理解字节流和字符流的区别,以及如何有效地使用缓冲,对于提高程序性能和避免数据丢失至关重要。在实际开发中,还需要注意异常处理,确保数据操作的完整性和安全性。