Java IO流是处理数据输入输出的核心机制,它将数据的传输抽象为“流”的形式。流的方向分为输入流(读取数据)和输出流(写入数据),而根据数据类型可分为字节流(处理二进制数据)和字符流(处理文本数据)。
按流向分类:
InputStream
(字节输入流基类)、Reader
(字符输入流基类),用于从文件、网络等外部数据源读取数据。OutputStream
(字节输出流基类)、Writer
(字符输出流基类),用于向文件或网络写入数据。按数据类型分类:
FileInputStream
(文件读取)、FileOutputStream
(文件写入)、BufferedInputStream
(缓冲优化)。FileReader
(文本读取)、FileWriter
(文本写入)、BufferedReader
(缓冲按行读取)。按功能分类:
FileInputStream
)。BufferedInputStream
)、转换流(InputStreamReader
)和对象流(ObjectInputStream
)。java// 使用字节流实现文件复制(支持任意类型文件)
try (FileInputStream fis = new FileInputStream("source.jpg");
FileOutputStream fos = new FileOutputStream("target.jpg")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
说明:通过字节流逐块读取文件内容并写入目标文件,适用于图片、视频等二进制文件。
java// 使用缓冲字符流按行读写文本文件
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine(); // 添加换行符
}
} catch (IOException e) {
e.printStackTrace();
}
说明:BufferedReader
的readLine()
方法按行读取文本,BufferedWriter
提高写入效率。
java// 对象序列化(需实现Serializable接口)
class Student implements Serializable {
private String name;
private int age;
// 构造方法、Getter/Setter省略
}
// 序列化对象到文件
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student.dat"))) {
oos.writeObject(new Student("张三", 20));
}
// 反序列化恢复对象
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("student.dat"))) {
Student s = (Student) ois.readObject();
System.out.println(s.getName()); // 输出:张三
}
说明:通过ObjectOutputStream
和ObjectInputStream
实现对象的持久化与恢复。
InputStreamReader
可将字节流转换为字符流(例如处理网络数据时指定编码)。BufferedInputStream
)。FileInputStream
/FileOutputStream
)。BufferedReader
/BufferedWriter
)。ObjectOutputStream
)。BufferedInputStream
)。try-with-resources
语法自动关闭流,避免内存泄漏。IOException
并处理文件不存在等异常。InputStreamReader
指定。Java IO流通过丰富的类库支持多种数据操作场景。掌握字节流与字符流的区别、合理使用缓冲与转换流,是高效处理IO的关键。对于复杂场景(如网络通信、对象序列化),需结合具体需求选择合适流类型。
缓冲流是Java IO流中的一种性能优化工具,通过减少底层I/O操作次数提升程序效率。其核心作用包括:
BufferedReader
)提供按行读取(readLine()
)、自动换行(newLine()
)等便捷方法。适用场景:文件复制、大文件上传下载、高频读写操作(如日志处理)。
java// 示例:Servlet中处理文件上传
try (BufferedInputStream bis = new BufferedInputStream(fileItem.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(savePath))) {
byte[] buffer = new byte[8192]; // 8KB缓冲区
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
throw new RuntimeException("上传失败:" + e.getMessage());
}
关键步骤:
InputStream
包装为BufferedInputStream
BufferedOutputStream
写入目标文件java// 示例:Servlet中处理文件下载
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = bis.read(buffer)) != -1) {
bos.write(buffer, 0, bytesRead);
}
bos.flush(); // 确保缓冲区数据全部输出
} catch (IOException e) {
response.sendError(500, "下载失败:" + e.getMessage());
}
关键步骤:
Content-Disposition
指定文件名)try-with-resources
自动关闭流,防止资源泄漏。IOException
、FileNotFoundException
,区分处理网络中断、磁盘空间不足等场景。Content-Type
或文件头验证文件类型,防止上传恶意文件。../
)。DiskFileItemFactory
)。FileUtils
),提供uploadFile()
和downloadFile()
方法,简化调用。缓冲流通过减少I/O操作次数显著提升文件传输效率,适用于各类文件上传下载场景。开发时需关注性能优化、异常处理与安全性,结合分块读写、多线程等技术可进一步优化大文件处理能力。具体实现可参考Apache Commons IO库或NIO的FileChannel
(零拷贝技术)。
本文作者:宁小健
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
预览: