构造方法创建的BufferedReader无法被类内方法访问的技术问询
问题分析与解决方案
你的代码报错的核心原因很明确:构造方法中创建的BufferedReader是局部变量,作用域仅限于构造方法的try代码块内,类的其他方法(比如hasNext()、getNext())无法访问到这个变量,所以会提示找不到br对象。
另外还有两个隐藏的小问题需要一并修复:
hasNext()方法里直接调用br.readLine()会消耗掉一行数据,导致getNext()拿到的是下一行,逻辑会出错rewrite()方法关闭流后,后续再调用读取方法会抛出IO异常
下面是修复后的完整代码,我会标注关键改动点:
import java.io.*; import java.util.*; public class SNIDDb { private char delimiter; private String name; // 1. 将BufferedReader声明为类的成员变量,让所有方法都能访问 private BufferedReader br; // 新增成员变量缓存下一行数据,解决hasNext()消耗行的问题 private String cachedLine; // 2. 构造方法抛出异常,让调用者处理文件打开失败的情况(比内部吞掉异常更合理) public SNIDDb(String name, char delimiter) throws IOException { this.name = name; this.delimiter = delimiter; FileReader fr = new FileReader(name); this.br = new BufferedReader(fr); // 提前读取第一行到缓存,初始化hasNext的判断依据 this.cachedLine = br.readLine(); } public Boolean hasNext() { // 直接判断缓存的行是否不为null,不会消耗数据 return cachedLine != null; } public String[] getNext() throws IOException { if (!hasNext()) { throw new NoSuchElementException("没有更多数据了"); } String currentLine = cachedLine; // 读取下一行到缓存,为下一次hasNext做准备 cachedLine = br.readLine(); return currentLine.split(String.valueOf(delimiter)); } public void rewrite() throws IOException { // 关闭读取流 br.close(); // 建议用try-with-resources自动关闭写入流,避免资源泄漏 try (BufferedWriter writer = new BufferedWriter(new FileWriter(name))) { // 这里可以添加具体的写入逻辑,比如清空文件或写入新内容 } } // 新增关闭流的方法,确保资源被正确释放 public void close() throws IOException { if (br != null) { br.close(); } } }
关键改动说明
- 成员变量声明:把
BufferedReader提升为类成员,让所有方法都能访问到这个读取器实例 - 缓存行处理:新增
cachedLine变量解决hasNext()和getNext()的行冲突问题,避免读取重复或丢失数据 - 异常处理优化:构造方法抛出
IOException,让调用者明确处理文件打开失败的场景,而不是默默吞掉异常 - 资源管理:新增
close()方法确保文件流能被正确关闭;rewrite()里使用try-with-resources自动管理写入流,避免资源泄漏
使用提示
创建SNIDDb实例后,建议使用try-with-resources确保资源自动释放:
try (SNIDDb db = new SNIDDb("test.txt", ',')) { while (db.hasNext()) { String[] line = db.getNext(); // 处理读取到的行数据 } db.rewrite(); } catch (IOException e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Raniel Johnson
相关产品推荐
相关产品推荐

