使用Java从项目文件夹获取文件

32

我想使用"File类"从项目文件夹中获取文件,我该如何做?

File file=new File("x1.txt");

3
好的,类似那样的东西。 - Tim Bender
当您尝试上述代码时,您收到了什么错误? - Taryn East
9个回答

36

嗯,在Java中有许多不同的方法来获取文件,但这是一般意义。

不要忘记至少要在外面包装一个try {} catch (Exception e){},因为File属于java.io,这意味着它必须有try-catch块。

不是针对Ericson的问题,但如果您使用实际包,您将会遇到文件位置的问题,除非您明确地使用其位置。包相关路径会出现问题。

例如,

src/
    main.java
    x.txt
在这个例子中,在main.java中使用File f = new File("x.txt");会抛出文件未找到异常。然而,使用File f = new File("src/x.txt");则可以正常工作。希望这能帮到你!

8
File本身不会抛出任何IOExceptions,它的一些方法可能会抛出,但是仅仅创建一个File对象不需要任何的try-catch。同时引用src目录也不是一个好主意,因为在应用程序构建和部署时,它将不可用。 - MadProgrammer

14

听起来像是文件被嵌入了您的应用程序。

您应该使用 getClass().getResource("/path/to/your/resource.txt"),它会返回一个 URLgetClass().getResourceAsStream("/path/to/your/resource.txt");

如果不是嵌入式资源,则需要知道从应用程序执行上下文到文件所在位置的相对路径。


2
你必须对盲目的负面评价感到惊讶 - 它在哪些方面没有回答问题?它如何改进?没有提到任何事情,也没有改变。 - MadProgrammer
请问能否提供一个访问非嵌入式资源的示例?假设我有一个文件 {project directory}/somewhere/X.txt,并尝试从 {project directory}/src/java/GetX.java 访问它。这会是什么样子? - beam022
1
@beam022 你遇到的问题是引用问题,即文件相对于应用程序启动位置的位置。由于应用程序可以从任何地方启动(也就是“工作目录”),因此可靠地维护对文件的引用变得困难。你可以使用相对路径(例如./somewhere/X.txt),但正如我刚才所说,一旦工作目录更改,这种方法就会失效。你可以使用绝对路径,但问题在于,你要将文件存储在哪里。 - MadProgrammer
@beam022 这个问题不仅仅是Java开发者所面临的,其他开发者也会遇到这个问题。请参考这个例子了解一般概述和这个例子了解一些细节。基本上,答案是尽可能遵循操作系统的惯例,并将内容存储在“众所周知”的位置。 - MadProgrammer

10
如果您正在尝试加载与Java类不在同一目录中的文件,则必须使用运行时目录结构,而不是设计时出现的目录结构。
要找出运行时目录结构,请检查{root project dir}/target/classes目录。此目录可通过“.” URL访问。
根据user4284592的答案,以下方法对我有效:
ClassLoader cl = getClass().getClassLoader();
File file = new File(cl.getResource("./docs/doc.pdf").getFile());

具有以下目录结构:

{root dir}/target/classes/docs/doc.pdf

以下是一份说明,让你不会盲目地复制黏贴我的代码:

  • java.lang.ClassLoader 是一个负责加载类的对象。每个 Class 对象都包含一个引用指向定义它的 ClassLoader,并可以使用 getClassLoader() 方法来获取它。
  • ClassLoader 的 getResource 方法根据给定的名称查找资源。资源是一些数据,可以以与代码位置无关的方式由类代码访问。

2
这对于包外的文件也适用吗?比如说在同一个项目文件夹下? - Schütze
2
所以,在我上面的回答中,“doc.pdf”文件完全在包之外。所讨论的包的位置类似于这个位置:{根目录}/src/main/java/com/chris/n/whateverMyClassNameIs.java - Chris Neve

10
如果您没有指定路径,只是放置文件(就像您所做的那样),默认目录始终是您的项目目录(它不在“src”文件夹中,它就在您的项目文件夹中)。

3

这些行在我的情况下可行,

ClassLoader classLoader = getClass().getClassLoader();
File fi = new File(classLoader.getResource("test.txt").getFile());

在src文件夹中提供了test.txt文件


3
String path = System.getProperty("user.dir")+"/config.xml";
File f=new File(path);

如果你的文件不在“资源”文件夹中,而是在根文件夹中,这将非常有用。 - hfc

2

假设在test/resources目录下有一个名为application.yaml的文件

ll src/test/resources/
total 6
drwxrwx--- 1 root vboxsf 4096 Oct  6 12:23 ./
drwxrwx--- 1 root vboxsf    0 Sep 29 17:05 ../
-rwxrwx--- 1 root vboxsf  142 Sep 22 23:59 application.properties*
-rwxrwx--- 1 root vboxsf   78 Oct  6 12:23 application.yaml*
-rwxrwx--- 1 root vboxsf    0 Sep 22 17:31 db.properties*
-rwxrwx--- 1 root vboxsf  618 Sep 22 23:54 log4j2.json*

从测试上下文中,我可以获得文件:

String file = getClass().getClassLoader().getResource("application.yaml").getPath(); 

这实际上将指向test-classes中的文件。

ll target/test-classes/
total 10
drwxrwx--- 1 root vboxsf 4096 Oct  6 18:49 ./
drwxrwx--- 1 root vboxsf 4096 Oct  6 18:32 ../
-rwxrwx--- 1 root vboxsf  142 Oct  6 17:35 application.properties*
-rwxrwx--- 1 root vboxsf   78 Oct  6 17:35 application.yaml*
drwxrwx--- 1 root vboxsf    0 Oct  6 18:50 com/
-rwxrwx--- 1 root vboxsf    0 Oct  6 17:35 db.properties*
-rwxrwx--- 1 root vboxsf  618 Oct  6 17:35 log4j2.json*

0

我刚刚做了一个快速的谷歌搜索,发现

System.getProperty("user.dir");

返回当前工作目录的字符串。因此,要从中获取一个文件,只需使用

File projectDir = new File(System.getProperty("user.dir"));

0

在JavaFX 8中

javafx.scene.image.Image img = new javafx.scene.image.Image("/myPic.jpg", true);

URL url = new URL(img.impl_getUrl());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接