BlueJ环境Java文件读写提示找不到输入文件的路径问题排查
问题根因
触发文件找不到错误的核心原因是路径拼接漏了分隔符:
你定义的filePath值为C:/Users/User/OneDrive/Desktop/JavaProgram,直接拼接inputFile后得到的完整路径是C:/Users/User/OneDrive/Desktop/JavaProgrambookTitles.inp,目录和文件名中间少了/,程序自然找不到目标文件。
除此之外代码还有几个隐藏问题:
- 你提到文件放在BlueJ同级目录,但代码硬编码了C盘绝对路径,只要BlueJ运行时的工作目录和你写的路径不匹配,就算补了分隔符也会报错
- 重复书名统计逻辑有缺陷:同一本书出现3次及以上时,重复列表会重复存储多条相同书名
- 流资源关闭逻辑写在try块内,一旦读文件中途抛出异常,打开的文件流无法正常释放,会造成资源泄漏
- 存在多处拼写错误(如
ouputFile应为outputFile),输出文件后缀注释和实际定义不一致,容易导致后续找错输出文件位置
修复方法
- 解决路径问题:如果文件确实放在BlueJ程序同级目录,直接用相对路径写文件名即可,不需要硬编码C盘绝对路径;如果要使用绝对路径,要么在
filePath末尾补/,要么用File类做路径拼接,避免漏写分隔符。可以在代码开头加System.out.println(System.getProperty("user.dir"));打印程序当前工作目录,确认文件查找的基准位置。 - 优化重复统计逻辑:用
HashMap存储每个书名的出现次数,最后筛选出现次数大于1的书名即可,不会重复记录。 - 用try-with-resources语法自动管理文件流,不需要手动写close方法,从语法层面避免资源泄漏。
- 修正拼写错误,统一输入输出文件的后缀配置。
修复后完整代码
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; public class GenerateDuplicateBookTitle { public static void main(String[] args) { // 文件放在BlueJ同级目录时直接写文件名即可 String inputFile = "bookTitles.inp"; String outputFile = "duplicateTitles.inp"; HashMap<String, Integer> bookTitleCount = new HashMap<>(); // try-with-resources 自动关闭文件流 try ( FileReader fr = new FileReader(inputFile); BufferedReader br = new BufferedReader(fr); FileWriter write = new FileWriter(outputFile) ){ String line; System.out.println("-------------- 开始读取文件 ---------------\n"); while((line = br.readLine()) != null){ bookTitleCount.put(line, bookTitleCount.getOrDefault(line, 0) + 1); System.out.println("已读取书名:" + line); } System.out.println("\n检测到的重复书名如下:"); for(String title : bookTitleCount.keySet()){ if(bookTitleCount.get(title) > 1){ System.out.println(title); write.write(title + "\n"); } } System.out.println("\n重复书名已成功写入输出文件 " + outputFile); }catch(FileNotFoundException e){ System.out.println("错误:未找到输入文件 " + inputFile + ",请确认文件位于程序工作目录下"); } catch (IOException ex) { System.out.println("文件操作异常:" + ex.getMessage()); } } }
排查提示:如果运行后依然提示找不到文件,先运行打印
user.dir的代码看当前工作目录是什么,把输入文件放到打印出的目录下即可。
内容的提问来源于stack exchange,提问作者Pouria
相关产品推荐
相关产品推荐

