从java项目文件夹中获取文件

从java项目文件夹中获取文件,java,file,Java,File,我想使用“文件类”从项目文件夹中获取文件,我如何才能做到这一点 File file=new File("x1.txt"); 这听起来像是文件嵌入到了应用程序中 您应该使用getClass().getResource(“/path/to/your/resource.txt”),它返回URL或getClass().getResourceAsStream(“/path/to/your/resource.txt”) 如果它不是嵌入式资源,那么您需要知道从应用程序的执行上下文到文件所在位置的相对路径如果

我想使用“文件类”从项目文件夹中获取文件,我如何才能做到这一点

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

这听起来像是文件嵌入到了应用程序中

您应该使用
getClass().getResource(“/path/to/your/resource.txt”)
,它返回
URL
getClass().getResourceAsStream(“/path/to/your/resource.txt”)


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

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

好吧,用Java获取文件有很多不同的方法,但这是一般要点

不要忘记,您至少需要将其封装在
try{}catch(异常e{}
中,因为该文件是
java.io
的一部分,这意味着它必须具有try-catch块

不是针对Ericson的问题,但是如果您使用的是实际的包,那么您将在文件的位置上遇到问题,除非您明确使用它的位置。相对路径会被包搞乱

在本例中,使用
filef=newfile(“x.txt”)main.java
内部的code>将引发文件未找到异常

但是,使用
File f=new文件(“src/x.txt”)将起作用


希望有帮助

这些行在我的情况下有效

ClassLoader classLoader = getClass().getClassLoader();
File fi = new File(classLoader.getResource("test.txt").getFile());
在JavaFX8中的src中提供了test.txt文件

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

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

只是在谷歌上快速搜索了一下就发现了

System.getProperty("user.dir");
以字符串形式返回当前工作目录。因此,要从中获取文件,只需使用

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

如果您试图加载与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
这里有一个解释,这样您就不会盲目地复制和粘贴我的代码:

  • 是负责加载类的对象。每个类对象都包含对定义它的类加载器的引用,并且可以使用方法获取它
  • ClassLoader的方法查找具有给定名称的资源。资源是一些可以由类代码以独立于代码位置的方式访问的数据
测试/资源

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(); 
这将实际指向
测试类中的文件

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*

对类似的。当您尝试上面的代码时,您收到了什么错误?
文件本身不会抛出任何
IOException
s。它的一些方法可以,但是简单地创建一个
文件
对象并不需要任何
try catch
…引用
src
目录也是一个坏主意,因为它在构建和部署应用程序时不可用。这对包外的文件有效吗?例如,就在同一个项目文件夹下?因此,在我上面的回答中,“doc.pdf”文件完全在包之外。所讨论的包的位置与此类似:{root dir}/src/main/java/com/chris/n/whateverMyClassNameIs.java您必须对盲下投票感到惊讶-这在哪些方面不能回答OP的问题?在哪些方面可以改进?没有提到,没有改变。请看一个不访问嵌入式资源的例子,好吗?假设我有一个文件
{project directory}/某处/X.txt
,我试图从
{project directory}/src/java/GetX.java
访问它。@beam022您遇到的问题是引用问题,其中的文件引用了应用程序启动的位置。由于应用程序可以从任何地方启动(也称为“工作目录”),因此很难可靠地维护对文件的引用。您可以使用相对引用(即
/where/X.txt
),但正如我刚才所说的,这会在工作目录更改时中断。您可以使用绝对路径,但问题是,文件存储在哪里。@beam022此问题不是Java独有的,或者开发人员有此问题。有关一般概述和一些详细信息,请参阅。基本上,答案是在可能的情况下遵循操作系统的约定,并将内容存储在“众所周知”的位置
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*
String path = System.getProperty("user.dir")+"/config.xml";
File f=new File(path);