
Java IO 从入门到深入第四篇缓冲流 Buffered 系列详解性能优化核心在前两篇中我们已经掌握了字节流InputStream / OutputStream字符流Reader / Writer但是你可能会发现一个问题IO 操作很慢例如逐字节读取文件性能非常差。为了解决这个问题Java 提供了一类非常重要的流缓冲流Buffered Stream一、什么是缓冲流缓冲流的核心思想减少 IO 次数提高性能原理一次读取一大块数据 → 在内存中处理而不是每次读取一个字节频繁访问磁盘类比理解不使用缓冲流每次去超市买一颗米使用缓冲流一次买一袋米二、缓冲流分类缓冲流分为两类1 字节缓冲流BufferedInputStream BufferedOutputStream2 字符缓冲流BufferedReader BufferedWriter三、BufferedInputStream 使用示例importjava.io.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{BufferedInputStreambisnewBufferedInputStream(newFileInputStream(test.txt));intdata;while((databis.read())!-1){System.out.print((char)data);}bis.close();}}四、BufferedOutputStream 使用BufferedOutputStreambosnewBufferedOutputStream(newFileOutputStream(test.txt));bos.write(Hello Buffered IO.getBytes());bos.close();为什么 close 很重要close() flush() 释放资源否则数据可能没写入文件五、BufferedReader 使用重点这是开发中最常用的类之一。readLine() 方法BufferedReaderbrnewBufferedReader(newFileReader(test.txt));Stringline;while((linebr.readLine())!null){System.out.println(line);}br.close();特点按行读取 自动处理换行六、BufferedWriter 使用BufferedWriterbwnewBufferedWriter(newFileWriter(test.txt));bw.write(Hello);bw.newLine();bw.write(Java IO);bw.close();七、缓冲流的底层原理面试重点核心结构byte[] buffer new byte[8192];默认缓冲区大小8KB工作流程读取磁盘 → buffer → 程序写入程序 → buffer → 磁盘为什么更快因为减少系统调用次数对比不使用缓冲流读1字节 → IO一次使用缓冲流读8KB → IO一次八、性能对比示例经典面试题普通字节流复制FileInputStreamfisnewFileInputStream(a.jpg);FileOutputStreamfosnewFileOutputStream(b.jpg);intdata;while((datafis.read())!-1){fos.write(data);}使用缓冲流BufferedInputStreambisnewBufferedInputStream(newFileInputStream(a.jpg));BufferedOutputStreambosnewBufferedOutputStream(newFileOutputStream(b.jpg));byte[]buffernewbyte[1024];intlen;while((lenbis.read(buffer))!-1){bos.write(buffer,0,len);}bis.close();bos.close(); 性能差距数倍甚至数量级提升九、推荐最佳实践非常重要最推荐写法try(BufferedReaderbrnewBufferedReader(newInputStreamReader(newFileInputStream(test.txt),UTF-8))){Stringline;while((linebr.readLine())!null){System.out.println(line);}}优点支持编码 支持缓冲 高性能 无乱码十、缓冲流使用场景1 大文件读取日志文件 数据文件2 文件复制图片 / 视频3 按行读取文件配置文件 日志分析十一、常见易错点1 忘记 flush()数据丢失解决flush() 或 close()2 BufferedReader 不能直接指定编码错误newBufferedReader(newFileReader(test.txt))问题编码不可控正确newBufferedReader(newInputStreamReader(newFileInputStream(test.txt),UTF-8))3 混用字节流和字符流容易乱码4 关闭顺序问题只需要关闭最外层流十二、面试高频问题1 为什么缓冲流更快标准答案减少 IO 次数 减少系统调用2 缓冲区大小是多少默认8KB3 readLine() 会包含换行符吗答案不会4 flush 和 close 区别方法作用flush刷新缓冲区closeflush 关闭资源5 为什么推荐 BufferedReader支持 readLine 效率高 使用方便十三、总结缓冲流是 Java IO 中性能优化的核心组件核心类BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter核心优势减少 IO 次数 提升性能 支持按行读取最推荐组合BufferedReader InputStreamReader UTF-8