如何从Java项目中的相对路径读取文件?java.io.File找不到指定的路径


113

我有一个包含2个软件包的项目:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

在包(2)中,我有一个文本文件ListStopWords.txt;在包(1)中,我有一个类FileLoadder。这是代码FileLoader

File file = new File("properties\\files\\ListStopWords.txt");

但是有这个错误:

The system cannot find the path specified

您能给出解决方案吗?谢谢。


12
您的两个软件包示例都是相同的。你不是故意properties.files2吗?
BalusC

Answers:


172

如果它已经在类路径中,则只需从类路径而不是磁盘文件系统中获取它即可。不要在中摆弄相对路径java.io.File。它们取决于当前的工作目录,您完全无法从Java代码内部对其进行控制。

假设ListStopWords.txt与您的FileLoader课程位于同一包中,请执行以下操作:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

或者,如果您最终想要得到InputStream的只是其中之一:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

这肯定比创建a优先,new File()因为url可能不一定代表磁盘文件系统路径,但也可能代表虚拟文件系统路径(当JAR扩展到内存而不是磁盘文件系统上的temp文件夹时,可能会发生)甚至网络路径,根据定义,这两个路径都不能由File构造函数消化。

如果文件是-如包名所示- 实际上是一个完全有价值的属性文件(包含key=value行),且扩展名仅是“错误”,则可以InputStream立即将其提供给该load()方法。

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

注意:当您尝试从内部static上下文中访问它时,请使用FileLoader.class(或其他方法YourClass.class)代替getClass()上面的示例。


是否从Java中删除了FileLoader?我正在尝试从静态上下文(java 6)进行此操作,找不到任何导入方法,并且它一直告诉我它无法解析为类型。奇怪的是,它在我键入时自动完成,但随后却给我一个错误。
涡轮增压

2
哦,应该是ClassLoader.class。
2013年

4
@turbo:FileLoader是OP自己的自定义类。它应该正是您试图获取资源的类。因此,NameOfYourCurrentClass.class.getResourceAsStream(...)ClassLoader.class如果ClassLoader类是由其他类加载器加载的,则此操作将失败,这可能会在具有多个类加载器层次结构的“企业”应用程序中发生(例如Java EE Web应用程序)。
BalusC 2013年

哦,我明白了。我不明白这是依赖的。感谢您清理!
2013年

10
关于文件是否不在同一软件包中的任何建议?在我的实例中,我试图打开一个位于测试包中的文件。
罗宾·纽豪斯

44

如果我们要指定文件的相对路径,可以使用以下行。

File file = new File("./properties/files/ListStopWords.txt");  

3
我可以知道为什么路径之间有3个斜线。
2014年

错误:>字符串文字中的非法转义字符。
IgorGanapolsky

如何将其转换为InputStream
IgorGanapolsky '16

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
卡梅伦·哈德森

42

相对路径在Java中使用。操作员。

  • 。表示与当前运行的上下文相同的文件夹。
  • ..表示当前正在运行的上下文的父文件夹。

因此,问题是您如何知道Java当前查找的路径?

做一个小实验

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

观察输出,您将知道java正在查找的当前目录。从那里,只需使用./运算符即可找到您的文件。

例如,如果输出是

G:\ JAVA8Ws \ MyProject \ content。

并且您的文件位于MyProject文件夹中,只需使用

File resourceFile = new File("../myFile.txt");

希望这可以帮助


经过数小时的搜索,这个答案为我提供了解决方案
erdostamasa

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolsky其类的名称。您.class只能通过提供类的全名来引用文字。
Tomasz Mularczyk '16

我认为它打算成为FileLoader。
jamesdeath123 '16


5

我可以发表评论,但我的代表较少。萨姆拉特的回答为我做了工作。最好通过以下代码查看当前目录路径。

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

我只是用它来纠正我在项目中面临的问题。确保使用./返回当前目录的父目录。

    ./test/conf/appProperties/keystore 

我正在通过Tomcat运行代码,因此当前目录不是项目文件夹-如何定义项目根目录的相对路径?我目前正在使用硬路径:“ C:\\ Users \\ user \\ Desktop \\ Repositories \\ L1_WebShop \\ dblogs.log”;
Tiago Redaelli

@TiagoRedaelli签出以下问题:stackoverflow.com/questions/12843217/…–
dezible

4

虽然BalusC提供的答案适用于这种情况,但当文件路径包含空格时,它将中断,因为在URL中,空格已转换为%20,这不是有效的文件名。如果使用URI而非String构造File对象,则将正确处理空格:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

我想在src / main // js / Simulator.java中解析“ command.json”。为此,我将json文件复制到src文件夹中,并给出了这样的绝对路径:

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

在此处输入图片说明

假设您要从类中的resources目录中读取FileSystem

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

注意:.不需要引导。


1

对我来说实际上问题是File对象的类路径是from <project folder path> or ./src,所以使用File file = new File("./src/xxx.txt");解决了我的问题


0

字符串basePath = new File(“ myFile.txt”)。getAbsolutePath(); 您可以使用此基本路径作为文件的正确路径


-1

如果您尝试getClass()从Static方法或static块调用,则可以执行以下方法。

您可以调用要加载到getClass()Properties对象。

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

只是缺少一个结束语。
jamesdeath123 '16

-1

如果未读取文本文件,请尝试使用更接近的绝对路径(如果希望可以使用完整的绝对路径),如下所示:

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

假定绝对路径为:

C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.