输入输出流(I/O streams)是Java中的基本概念之一,自语言的早期版本以来就存在。这个概念最初是为了抽象化数据的读取和写入过程:流可以与文件、网络甚至控制台关联——对代码而言,看起来都是一样的。
问题发生在开发人员错误地管理流,忘记关闭它们或混淆不同类型的流(字符流和字节流),这通常会导致资源泄漏、数据扭曲或运行时错误。
解决方案是正确理解和应用输入输出流的层次(InputStream/OutputStream用于字节,Reader/Writer用于字符),并在完成工作后强制关闭流,最好从Java 7开始使用带资源的try语句。
读取和写入文件的代码示例:
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { String line; while ((line = reader.readLine()) != null) { writer.write(line); writer.newLine(); } }
关键特点:
如果不关闭Java中的输入输出流会发生什么?
流处理操作系统的低级资源,不关闭流可能导致内存泄漏、文件锁定、应用程序故障或甚至耗尽操作系统级别的文件描述符。
可以使用同一个OutputStream向不同文件写入吗?
不可以,经典的OutputStream严格关联一个数据源/接收器。对于不同的文件——需要不同的OutputStream对象。
PrintWriter和BufferedWriter之间有什么区别?什么时候使用哪个?
PrintWriter专注于使用格式化打印方法,如println(),并能够工作于自动换行。BufferedWriter主要通过缓冲来提高性能。在大多数应用场景中,PrintWriter更适合文本输出,但如果只是快速写入字符或字符串而不格式化——BufferedWriter更为合适。
开发人员通过FileInputStream读取大文件数据,不使用缓冲且忘记关闭流。
优点:
缺点:
使用BufferedReader与try-with-resources结合,按行批量读取和处理,自动关闭流。
优点:
缺点: