【问题标题】:Get file from project folder using java使用java从项目文件夹中获取文件
【发布时间】:2013-06-25 00:52:31
【问题描述】:

我想通过“文件类”从项目文件夹中获取文件,我该怎么做?

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

【问题讨论】:

  • 是的。类似的东西。
  • 您在尝试上述代码时收到了什么错误?

标签: java file


【解决方案1】:

嗯,在 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-not-found 异常。

但是,使用File f = new File("src/x.txt"); 会起作用。

希望有帮助!

【讨论】:

  • File 本身不会抛出任何IOExceptions。它的一些方法可以,但简单地创建File 对象不需要任何try-catch...引用src 目录也是一个坏主意,因为在构建和部署应用程序时它将不可用。
【解决方案2】:

这听起来像是文件嵌入在您的应用程序中。

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

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

【讨论】:

  • 您必须惊叹于盲目投票 - 这在哪些方面不能回答 OP 的问题?在哪些方面可以改进?没有提及,没有任何改变
  • 能否请看一个访问非嵌入式资源的示例?假设我有一个文件{project directory}/somewhere/X.txt,我尝试从{project directory}/src/java/GetX.java 访问它。那会是什么样子?
  • @beam022 您遇到的问题是引用之一,其中文件引用了应用程序启动的位置。由于应用程序可以从任何地方(也称为“工作目录”)启动,因此很难可靠地维护对文件的引用。您可以使用相对引用(即./somewhere/X.txt),但正如我刚才所说,这会破坏工作目录更改的时刻。您可以使用绝对路径,但问题是,您将文件存储在哪里。
  • @beam022 这个问题不是 Java 独有的,或者开发人员也有这个问题。有关一般概述,请参阅this example,有关一些详细信息,请参阅this example。本质上,答案是尽可能遵循操作系统的约定,并将内容存储在“众所周知”的位置
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果您尝试加载与 Java 类不在同一目录中的文件,则必须使用运行时目录结构,而不是在设计时出现的目录结构。

    要了解运行时目录结构是什么,请检查您的 {root project dir}/target/classes 目录。该目录可通过“.”访问。网址。

    根据 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 方法查找具有给定名称的资源。资源是可以由类代码以独立于代码位置的方式访问的一些数据。

    【讨论】:

    • 这对包外的文件有用吗?例如,就在同一个项目文件夹下?
    • 所以,在我上面的回答中,“doc.pdf”文件完全在包之外。有问题的包的位置与此类似:{root dir}/src/main/java/com/chris/n/whateverMyClassNameIs.java
    【解决方案5】:

    这些行在我的情况下有效,

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

    在 src 中提供了 test.txt 文件

    【讨论】:

      【解决方案6】:

      给定一个文件application.yaml in test/resources

      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*
      

      【讨论】:

        【解决方案7】:
        String path = System.getProperty("user.dir")+"/config.xml";
        File f=new File(path);
        

        【讨论】:

        • 如果您的文件不在resources 文件夹中,而只是在根文件夹中,这非常有用。
        【解决方案8】:

        刚刚用谷歌搜索了一下,发现

        System.getProperty("user.dir");
        

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

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

        【讨论】:

          【解决方案9】:

          在 javaFx 8 中

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-12-08
            • 2016-08-06
            • 1970-01-01
            • 1970-01-01
            • 2011-09-11
            相关资源
            最近更新 更多