如何不使用文件完整路径访问文件?与Runner类同处src目录的deneme.txt为何无法直接通过文件名访问?
嘿,我来帮你搞定这个问题~你遇到的核心问题是对Java中相对路径的工作目录理解有误,下面我分两部分给你解释和解决:
为什么直接用deneme.txt找不到文件?
Java里File类的相对路径,是相对于程序运行时的工作目录(Working Directory),而不是你的.java源文件所在的src目录。
在Eclipse中,默认的工作目录是你的项目根目录(也就是HW1这个文件夹),而你的deneme.txt放在src子目录下。当你写new File("deneme.txt")时,Java会去HW1目录下找这个文件,而不是HW1/src,自然就找不到啦。
不用完整路径访问文件的几种方法
方法1:使用相对于工作目录的相对路径
既然工作目录是项目根,那直接指定src下的路径就行:
import java.io.File; public class Runner { public static void main(String []args) { // 用相对路径指向src目录下的文件 File file = new File("src/deneme.txt"); System.out.println(file.exists()); System.out.println(file.isFile()); } }
Windows系统下也可以用src\\deneme.txt,不过推荐用/,Java会自动处理跨平台的路径分隔符。
方法2:把文件移到项目根目录
如果允许的话,直接把deneme.txt放到HW1目录下(和src同级),这样new File("deneme.txt")就能直接找到文件了,这是最简单的方式。
方法3:用类加载器获取资源(推荐用于项目打包场景)
如果你的文件是项目的资源文件(比如配置文件、数据文件),更推荐用类加载器来获取,这种方式不管是在IDE里运行,还是以后打包成JAR文件,都能正确找到文件:
import java.io.File; import java.net.URL; public class Runner { public static void main(String []args) { try { // 通过类加载器获取同目录下的资源 URL fileUrl = Runner.class.getResource("deneme.txt"); if (fileUrl != null) { File file = new File(fileUrl.getPath()); System.out.println(file.exists()); System.out.println(file.isFile()); } else { System.out.println("文件未找到"); } } catch (Exception e) { e.printStackTrace(); } } }
原理是:当你编译项目时,src下的文件会被复制到编译后的输出目录(比如Eclipse的bin目录),和Runner.class文件在同一个目录下。类加载器会从类的所在路径去查找资源,所以能精准定位到文件。
如果只是需要读取文件内容,还可以直接用getResourceAsStream获取输入流,不用处理File对象,更方便:
import java.io.InputStream; import java.util.Scanner; public class Runner { public static void main(String []args) { try (InputStream is = Runner.class.getResourceAsStream("deneme.txt"); Scanner scanner = new Scanner(is)) { // 读取文件内容 while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Serhat Taş

