Java运行报java.nio.file.NoSuchFileException无法读取Eclipse项目下input.txt问题
问题原因排查
- 文件名输入不完整:运行时你输入的是
input,但实际文件全名为input.txt,缺少后缀名导致路径匹配失败,和报错信息里的NoSuchFileException: input完全对应。 - Eclipse运行工作目录不匹配:Eclipse执行Java代码时,默认的相对路径基准目录(工作目录)不一定是项目根目录,大概率默认设置为模块的
bin目录,相对路径无法定位到根目录下的文件。 - 原有代码存在隐患:手动切割换行符的逻辑在遇到空行时会触发
StringIndexOutOfBoundsException异常,且未指定文件读写的字符编码,不同系统环境下可能出现乱码。
解决方案
1. 快速验证修复
先直接测试输入完整文件名input.txt,如果还是报错就调整Eclipse运行配置:
- 右键你的Java类 -> 选择
Run As->Run Configurations - 切换到
Arguments标签页 - 找到底部的
Working directory设置,选择Other,点击Workspace选中你的项目根目录,保存配置后重新运行即可。
2. 优化后代码实现
替换原有逻辑,增加后缀自动补全、路径排查打印、字符编码指定、空行兼容处理:
import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; import java.util.Scanner; class FileOperations { public static void main(String[] args) throws IOException { Scanner input = new Scanner(System.in); String filename; System.out.print("Enter file name: "); filename = input.next(); // 自动补全txt后缀,避免漏输 if (!filename.endsWith(".txt")) { filename += ".txt"; } // 打印实际查找的文件绝对路径,方便排查位置是否正确 System.out.println("正在查找文件:" + Paths.get(filename).toAbsolutePath()); // 直接用readAllLines读取,自动处理换行符,无需手动切割 List<String> lines = Files.readAllLines(Paths.get(filename), StandardCharsets.UTF_8); int result; do { System.out.println("\n菜单:\n1. 读取并统计文件中指定字符串出现次数\n" + "2. 读取并展示指定内容所在行号\n" + "3. 按字母升序排序文件内容\n" + "0. 退出"); result = input.nextInt(); input.nextLine(); // 消费输入数字后的残留换行符 if (result == 1) { String pattern; System.out.print("输入要查找的字符串: "); pattern = input.nextLine(); int counter = 0; for (String line : lines) { counter += line.split(pattern, -1).length - 1; } if (counter > 0) System.out.println("\n字符串 (" + pattern + ") 共出现 " + counter + " 次。"); else System.out.println("\n未找到字符串 (" + pattern + ") !"); } else if (result == 2) { String lineContent; System.out.print("输入要查找的行内容: "); lineContent = input.nextLine(); boolean found = false; for (int i = 0; i < lines.size(); i++) { if (lines.get(i).equals(lineContent)) { System.out.println("\n内容为 (" + lineContent + ") 的行在第 " + (i + 1) + " 行。"); found = true; break; } } if (!found) { System.out.println("\n未找到内容为 (" + lineContent + ") 的行!"); } } else if (result == 3) { // 调用JDK自带排序方法,效率高于手动实现的冒泡排序 lines.sort(String::compareTo); Files.write(Paths.get(filename), lines, StandardCharsets.UTF_8); System.out.println("\n文件内容已按字母升序排序完成。"); } else { System.out.println("\n程序已退出!"); result = 0; } } while (result != 0); } }
3. 替代实现方案
如果不想每次调整运行配置,可以直接使用绝对路径读取文件,比如文件存放在D:\eclipse-workspace\你的项目名\input.txt,运行时直接输入完整的绝对路径即可。
内容的提问来源于stack exchange,提问作者Crazyknight
相关产品推荐
相关产品推荐

