在Java编程中, 输入输出流(I/O Stream) 是处理数据读写操作的核心机制。无论是读取文件、网络通信还是用户交互,都离不开流的概念。小编将深入解析Java输入输出流的原理、分类及实际应用,帮助开发者掌握这一关键技术。
一、什么是输入输出流?
输入输出流是Java中用于数据传输的抽象概念:
输入流(InputStream/Reader) :从数据源(如文件、网络)读取数据到程序。
输出流(OutputStream/Writer) :将程序中的数据写入目标(如文件、控制台)。
流的本质是有序的数据序列,通过流可以逐字节或逐字符处理数据,避免一次性加载全部内容,节省内存资源。
二、流的分类
Java I/O流按处理单位分为两类:
1. 字节流(Byte Streams)
处理原始二进制数据(8位字节)。
核心类:
InputStream:抽象输入字节流(如FileInputStream)。
OutputStream:抽象输出字节流(如FileOutputStream)。
适用场景:图片、音频等非文本文件。
示例:文件复制(字节流)
try (InputStream in = new FileInputStream("source.jpg");
OutputStream out = new FileOutputStream("copy.jpg")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead); // 逐字节复制
}
} catch (IOException e) {
e.printStackTrace();
}
运行
2. 字符流(Character Streams)
处理Unicode字符(16位),自动处理字符编码。
核心类:
Reader:抽象输入字符流(如FileReader)。
Writer:抽象输出字符流(如FileWriter)。
适用场景:文本文件(如TXT、CSV)。
示例:读取文本文件(字符流)
try (Reader reader = new FileReader("text.txt");
Writer writer = new FileWriter("output.txt")) {
char[] buffer = new char[128];
int charsRead;
while ((charsRead = reader.read(buffer)) != -1) {
writer.write(buffer, 0, charsRead); // 逐字符写入
}
} catch (IOException e) {
e.printStackTrace();
}
运行
三、高级流:装饰器模式的应用
Java通过装饰器模式提供增强功能的流:
缓冲流(Buffered Streams) :减少I/O次数,提升效率。
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = br.readLine()) != null) { // 一次读取一行
System.out.println(line);
}
}
运行
数据流(Data Streams) :直接读写基本数据类型。
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.bin"))) {
dos.writeInt(100); // 写入整数
dos.writeUTF("Hello"); // 写入字符串
}
运行
对象流(Object Streams) :序列化与反序列化对象。
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"))) {
oos.writeObject(new ArrayList<>()); // 写入对象
}
运行
四、关键注意事项
资源关闭:
使用try-with-resources自动关闭流(Java 7+),避免资源泄漏。
性能优化:
优先使用缓冲流(如BufferedInputStream),减少磁盘/网络访问次数。
字符编码:
指定编码(如UTF-8)防止乱码:new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8);
运行
Java输入输出流是程序与外部世界沟通的桥梁。理解字节流与字符流的区别、掌握装饰器模式的应用,并遵循资源管理最佳实践,能显著提升程序的健壮性和效率。随着NIO(非阻塞I/O)的普及,传统I/O流仍是Java开发者必须扎实掌握的基础技术。