如何解决java.nio.file.NoSuchFileException?项目内文件读取失败求助
解决Java读取项目中result.csv文件时的NoSuchFileException问题
从你贴的异常信息来看,核心问题就是程序找不到你指定的result.csv文件,这在Eclipse里运行Java程序时是很常见的小坑,我来给你拆解问题和解决办法:
问题根源
你代码里用了相对路径"result.csv",但Eclipse运行Java程序时,默认的工作目录是你的项目根目录——如果你的文件没放在项目根目录,或者Eclipse没同步到这个文件,程序自然找不到它。另外,也有可能你的运行配置里的工作目录被修改过,导致路径匹配不上。
快速解决办法
1. 确认文件位置并刷新项目
先定位你的result.csv:
- 如果它就在项目根目录下:右键你的项目 -> 选择
Refresh,让Eclipse同步文件,然后重新运行程序试试。 - 如果它在子目录里(比如
src、resources文件夹):别直接用相对路径,改用类加载器来获取文件,这是更通用的写法:
public static void main(String [] args) { int i=0; // 用类加载器获取资源文件 URL resource = TestGeoHash.class.getClassLoader().getResource("result.csv"); if (resource == null) { System.err.println("找不到result.csv文件,请检查文件位置!"); return; } Path pathToFile = null; try { pathToFile = Paths.get(resource.toURI()); } catch (URISyntaxException e) { e.printStackTrace(); return; } try (BufferedReader br = Files.newBufferedReader(pathToFile, StandardCharsets.US_ASCII)) { String line = br.readLine(); // 新增line != null判断,避免读到文件末尾时出现空指针 while (i<10 && line != null) { String[] attributes = line.split(","); double x=Double.parseDouble(attributes[8]); double y=Double.parseDouble(attributes[9]); System.out.println(GeoHash.withCharacterPrecision(x, y, 10)); line = br.readLine(); i++; } } catch (IOException ioe) { ioe.printStackTrace(); } }
2. 检查Eclipse的运行配置
如果刷新后还是不行,可能是运行配置的工作目录不对:
- 右键你的
TestGeoHash类 ->Run As->Run Configurations - 切换到
Arguments标签页,查看Working directory是否是${project_loc}(这代表项目根目录),如果不是,改成这个值再运行。
更优雅的替代方案:用Apache Commons CSV处理CSV
自己用split(",")处理CSV容易踩坑(比如字段里包含逗号、带引号的情况),推荐用Apache Commons CSV库来简化操作:
- 如果是Maven项目,在
pom.xml里加依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.10.0</version> </dependency>
- 读取文件的代码示例:
public static void main(String[] args) { URL resource = TestGeoHash.class.getClassLoader().getResource("result.csv"); if (resource == null) { System.err.println("找不到result.csv文件"); return; } try (Reader reader = Files.newBufferedReader(Paths.get(resource.toURI()), StandardCharsets.US_ASCII); CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT)) { int count = 0; for (CSVRecord record : csvParser) { if (count >= 10) break; // 直接通过索引获取字段,不用自己拆分 double x = Double.parseDouble(record.get(8)); double y = Double.parseDouble(record.get(9)); System.out.println(GeoHash.withCharacterPrecision(x, y, 10)); count++; } } catch (IOException e) { e.printStackTrace(); } }
这个方案不仅解决了文件路径问题,还能处理各种复杂的CSV格式,稳定性更高。
内容的提问来源于stack exchange,提问作者Snkini
相关产品推荐
相关产品推荐

