如何使用BufferedReader将用户输入与文本文件内容进行对比?
问题排查
- 核心逻辑错误:
wordIsThere方法的循环条件中,直接将文件读取结果赋值给了存储用户输入的findMe变量,直接覆盖了原本要匹配的目标内容,匹配逻辑从根源失效。 - 文件内容漏读:循环体内又额外调用了一次
bufferedReader.readLine(),每次循环会连续读取2行,仅比对第2、4、6等偶数行,所有奇数行直接被跳过。 - 资源泄漏风险:BufferedReader使用完成后没有主动关闭,长期运行会造成IO资源占用。
- 编码适配问题:
FileReader默认使用操作系统编码读取文件,若txt文件的保存编码和系统编码不一致,会读取到乱码,导致匹配失败。
修复后的完整代码
import javax.swing.*; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class Lab5Program1 { public static void main(String[] args) throws IOException { File file = new File("fileName"); // 改用try-with-resources自动关闭流,指定UTF-8编码避免乱码 try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) { String isOrIsNot, inputWord; inputWord = JOptionPane.showInputDialog(null, "Enter a word in all lower case:"); if (wordIsThere(inputWord, br)) isOrIsNot = "is"; else isOrIsNot = "is not"; JOptionPane.showMessageDialog(null, "The word " + inputWord + " " + isOrIsNot + " on the list."); } } public static boolean wordIsThere(String findMe, BufferedReader bufferedReader) throws IOException { String line; // 单独用变量存储读取到的每行内容,不覆盖目标匹配词 while((line = bufferedReader.readLine()) != null) { // trim去除首尾空白,避免因为换行残留、空格导致匹配失败 if (findMe.equals(line.trim())){ return true; } } return false; } }
优化建议
- 提前加载单词到内存:如果需要多次校验单词,不要每次校验都重新读取文件。可以在程序启动时一次性把所有单词读取到
HashSet中,后续查找的时间复杂度从O(n)降低到O(1),性能提升明显。 - 增加容错规则:可以将用户输入和读取到的单词统一转为小写/大写后再匹配,避免大小写不一致导致匹配失败。
- 增加异常处理:提前判断文件是否存在、是否可读,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者OEThe11
相关产品推荐
相关产品推荐

