Java的BufferedReader
BufferedReader 是 Java 中的一个类,用于从字符输入流中读取文本,缓冲字符以提供字符、数组和行的高效读取。它属于 java.io 包。使用 BufferedReader 可以提高读取大量数据的性能,因为每次读取可以获得多个字符,而不是每次读取一个字符。
创建 BufferedReader
通常,BufferedReader 是围绕其他的 Reader 对象创建的,如 FileReader,用于读取文件中的字符数据。
FileReader fileReader = new FileReader("example.txt"); BufferedReader bufferedReader = new BufferedReader(fileReader);
常用方法
- read(): 读取单个字符。
- read(char[] cbuf, int off, int len): 将字符读入数组的一部分。
- readLine(): 读取一个文本行,读取到行的结尾(换行符)或文档结尾返回null。
- close(): 关闭流并释放与之关联的所有系统资源。
读取数据
使用 BufferedReader 最常见的方式是按行读取文本文件。
()String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); }
在这个示例中,readLine() 方法在文件末尾返回 null,循环随之结束。
资源管理
在 Java 7 及以上版本中,可以使用 try-with-resources 语句来自动管理资源,自动为你关闭 BufferedReader。
try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
在这个示例中,try 语句块结束后,BufferedReader 会自动调用 close() 方法,这样可以避免资源泄露。
异常处理
在处理 IO 操作时,你必须处理或抛出 IOException。通常,你会在方法签名中添加 throws IOException,或者在 try-catch 块中捕获异常。
示例代码
下面是一个完整的示例,展示了如何使用 BufferedReader 来读取文件内容。
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReaderExample { public static void main(String[] args) { String filePath = "example.txt"; try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
在上述代码中,example.txt 的内容会被逐行读取并打印到控制台。如果文件不存在或者读取过程中出现其他 IO 问题,IOException 会被捕获并打印堆栈跟踪。
以下是几个不同场景中使用 BufferedReader 的例子。
1. 从控制台读取用户输入
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ConsoleReaderExample { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.println("Hello, " + name + "!"); } catch (IOException e) { e.printStackTrace(); } } }
2. 读取网络资源
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; public class NetworkReaderExample { public static void main(String[] args) { try { URL url = new URL("http://example.com/"); try (InputStream is = url.openStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is))) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } catch (IOException e) { e.printStackTrace(); } } }
3. 读取字符数组
import java.io.BufferedReader; import java.io.CharArrayReader; import java.io.IOException; public class CharArrayReaderExample { public static void main(String[] args) { char[] charArray = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'}; try (CharArrayReader car = new CharArrayReader(charArray); BufferedReader br = new BufferedReader(car)) { int value; while ((value = br.read()) != -1) { char c = (char) value; System.out.print(c); } } catch (IOException e) { e.printStackTrace(); } } }
4. 从 StringReader 读取
import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; public class StringReaderExample { public static void main(String[] args) { String text = "Hello\nWorld\nThis is a string."; try (StringReader sr = new StringReader(text); BufferedReader br = new BufferedReader(sr)) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
5. 使用 BufferedReader 和 BufferedWriter 一起复制文件
import java.io.*; public class CopyFileExample { public static void main(String[] args) { File inputFile = new File("input.txt"); File outputFile = new File("output.txt"); try (BufferedReader br = new BufferedReader(new FileReader(inputFile)); BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile))) { String line; while ((line = br.readLine()) != null) { bw.write(line); bw.newLine(); } } catch (IOException e) { e.printStackTrace(); } } }
在所有这些示例中,错误处理都是通过 try-catch 块实现的,这是处理 Java 中的 IO 操作时的最佳实践。此外,try-with-resources 语句确保了所有打开的资源在操作完成后都会被正确关闭。