在本文中,我们将深入探讨Java中的IO流。IO流是Java语言中最基本的输入输出机制,它们使得程序可以与外部世界进行交互,读取或写入数据。理解和掌握IO流对于每一位Java开发者来说都是至关重要的。
IO流的分类
Java中的IO流主要分为两大类:字节流和字符流。
字节流 vs 字符流
在Java中,有两种类型的流:字节流和字符流。字节流用于处理二进制数据,而字符流则专门用于处理文本数据。
字节流
字节流的主要类是InputStream
和OutputStream
。它们的子类提供了对不同数据源的访问,例如文件、网络连接、内存缓冲区等。
示例:读取和写入文件
使用FileInputStream
和FileOutputStream
可以读取和写入文件中的二进制数据。
try (FileInputStream fis = new FileInputStream("input.bin");
FileOutputStream fos = new FileOutputStream("output.bin")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer))!= -1) {
fos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
字符流
字符流的主要类是Reader
和Writer
。它们的子类也提供了对不同数据源的访问,例如文件、网络连接、内存缓冲区等。
示例:读取和写入文本文件
使用FileReader
和FileWriter
可以读取和写入文本文件中的字符数据。
try (FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")) {
char[] buffer = new char[1024];
int charsRead;
while ((charsRead = fr.read(buffer))!= -1) {
fw.write(buffer, 0, charsRead);
}
} catch (IOException e) {
e.printStackTrace();
}
流的层次结构
Java的IO流采用装饰器模式,允许你在不改变原有流的基础上,增强或修改流的行为。例如,你可以将一个BufferedInputStream
包装在一个FileInputStream
之上,以便在读取文件时使用缓冲。
示例:使用缓冲流
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.bin"))) {
// 使用 bis 进行读取操作
} catch (IOException e) {
e.printStackTrace();
}
高级流和基础流
高级流通常是以其他流作为参数构造的,它们提供了更高级的功能,如缓冲、格式化、压缩等。基础流则是直接与数据源交互的流。
示例:使用高级流
使用DataInputStream
可以方便地读取基本数据类型。
try (DataInputStream dis = new DataInputStream(new FileInputStream("input.bin"))) {
int i = dis.readInt();
double d = dis.readDouble();
//...
} catch (IOException e) {
e.printStackTrace();
}
常用的IO流类
以下是一些常用的IO流类:
字节流
FileInputStream
和FileOutputStream
: 用于读写文件。ByteArrayInputStream
和ByteArrayOutputStream
: 在内存中读写字节数组。BufferedInputStream
和BufferedOutputStream
: 提供缓冲功能,提高读写效率。DataInputStream
和DataOutputStream
: 可以读写基本数据类型(如int、double等)。ObjectInputStream
和ObjectOutputStream
: 用于序列化和反序列化对象。
字符流
FileReader
和FileWriter
: 用于读写文本文件。BufferedReader
和BufferedWriter
: 提供缓冲功能,提高读写效率。StringReader
和StringWriter
: 在内存中读写字符串。PrintWriter
: 可以打印各种类型的数据。
使用IO流的基本步骤
- 打开流:创建一个流对象并将其与数据源关联。
- 读写数据:使用流对象的方法读取或写入数据。
- 关闭流:在完成读写操作后,关闭流以释放资源。
示例:使用try-with-resources自动关闭流
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"))) {
String line;
while ((line = br.readLine())!= null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
异常处理
在使用IO流时,可能会遇到各种异常,例如文件不存在、权限不足等。因此,正确的异常处理非常重要。
示例:捕获和处理异常
try {
// 读写操作
} catch (FileNotFoundException e) {
System.err.println("文件未找到");
} catch (IOException e) {
System.err.println("IO错误");
} finally {
// 关闭流
}
希望这些详细信息和示例能帮助你更好地理解和应用Java中的IO流。