【问题标题】:How can I open a file without specifying the absolute directory?如何在不指定绝对目录的情况下打开文件?
【发布时间】:2013-08-09 13:53:55
【问题描述】:

我有一个文件位于我的项目目录中:

src/test/resources/250.csv

这是需要它的代码:

CSVReader reader = new CSVReader(new FileReader(FILE_PATH));

FILE_PATH 应该是String

我该如何转这条路:

final String FILE_PATH = "C:\\Users\\Kowalski\\Desktop\\test-master\\test1\\src\\test\\resources\\250.csv"

进入更可靠和相对的东西?

我需要能够在 Windows 和 Linux 上运行我的代码并将此资源文件与项目一起移动,因此我不必指定到达它的绝对路径,而是指定相对于我的项目的路径。

我读过这个问题,但无法将其应用于我的案例:Absolute Path of Project's folder in Java

编辑:我有 4 周的经验,我认为自己对这门语言真的很陌生

编辑:这是公认答案的解决方案:

final String FILE_PATH = "src/test/resources/250.csv";

【问题讨论】:

  • 您还希望此资源文件可编辑吗?
  • 不,我不希望它是可编辑的。
  • 或使用通过查看工作目录来工作的相对parh
  • 我不知道什么是类加载器
  • 这是您搜索的关键字。看看新的答案。

标签: java


【解决方案1】:

运行代码时,任何相对路径都将连接到当前目录。因此,如果您从项目目录运行代码,则可以输入FILE_PATH = "src/test/resources/250.csv"。 或者,您可以计算 csv 文件相对于您的类/jar 文件的位置。

但在这种情况下最正确的做法是将文件路径作为命令行参数传递:

// ...
public static void main(String [] args) {
    // if args.length != 1 display some useful message and exit
    String filePath = args[1];
    CSVReader reader = new CSVReader(new FileReader(filePath));
    // ...
}
// ...

【讨论】:

  • 这是迄今为止最好的解释,而且实现起来非常简单
【解决方案2】:

Java 中的相对路径是相对于用户执行命令时所在的位置。这对某些事情(例如 shell 命令)很有意义,但对其他事情则不然。我想到了两种标准的替代方法来处理这个问题(尽管我相信还有更多)。

  • 将资源放在类路径中

如果您的资源是应用程序的一部分,并且用户不需要查看或编辑资源,那么您可以简单地将其放在类路径中(在 Maven 中 src/main/resources 会自动添加到类路径和文件中已捆绑到 JAR 中,因此它们在部署时将位于类路径中),然后使用 Class.getResource() 加载它。

  • 创建用户数据目录

创建一个用于存储用户文件的目录(例如~/.appname)并创建一个实用程序类,用于将文件保存和加载到该数据目录并在启动时初始化该目录(如果该目录不存在)。这样你的代码就不会被长的绝对路径弄得杂乱无章,而且你的应用程序将是可移植的。

【讨论】:

    【解决方案3】:

    您可以使用 getResource/AsResource 来处理 relativeclassloader 的路径。

    getclassLoader().getResourceAsStream(relativePath)
    getclassLoader().getResource(relativePath)
    

    路径应该相对于类加载器的类路径根。您可以查看SO 和此处查看documentation

    您还可以查看另一个适用于相对于 .class 的路径的变体。

    class.getResourceAsStream(relativePath)
    class.getResource(relativePath)
    

    示例代码

    //As file
    URL loc = this.class.getclassLoader().getResource("250.csv");
    File f = new File(loc.getPath());
    //As Stream
    InputStream loc = this.class.getclassLoader().getResourceAsStream("250.csv");
    InputStreamReader in = new InputStreamReader(loc);
    

    假设src/test/resources/ 中的文件在您的类路径中。

    【讨论】:

    • 这段代码应该放在哪里?你能把它放在某种上下文中吗?
    • 谢谢,但 FILE_PATH 必须是字符串,我尝试将 File f 转换为字符串,但什么也没发生
    【解决方案4】:

    看看ClassLoader's getResource(String name) 方法。它将尝试在类路径中找到命名资源。假设您使用的是 maven,src/main/resources 中的任何内容都将在类路径中并且会被找到。

    【讨论】:

      【解决方案5】:

      你应该使用资源加载器:

      this.getClass().getClassLoader().getResourceAsStream("250.csv");
      

      【讨论】:

        【解决方案6】:

        这条路径 src/test/resources/250.csv 表明这是一个 Mavne 项目。如果是这种情况,那么这个文件就是一个资源,它将在根级别进入项目 jar,并且可以这样读取

        CSVReader reader = new CSVReader(new InputStreamReader(getClass().getResourceAsStream("250.csv")));
        

        【讨论】:

          【解决方案7】:

          这是获取项目根路径的方法:

          String path = System.getProperty("user.dir");
          

          编辑:我误读了您的要求:

          getClass().getClassLoader().getResourceAsStream("yourFileName");
          

          【讨论】:

            【解决方案8】:
            URL fileURL= yourClassName.class.getResource("yourFileName.extension");
            String myURL= fileURL.toString();
            

            现在您不需要长路径名,而且这个路径本质上是动态的,也就是说,您现在可以将您的项目移动到任何电脑、任何驱动器。
            这是因为它通过使用您的 CLASS 位置而不是通过任何静态位置(如 c:\folder\ab.mp3,然后如果您移动到 ​​D 驱动器则无法访问该文件,因为您必须更改为 D: /folder/ab.mp3 手动,本质上是静态的)
            (注意:只需将该文件与您的项目一起保存)

            您可以将 fileURL 用作: File file=new File(fileURL.toURI());
            您可以将 myURL 用作: Media musicFile=new Media(myURL); //在javaFX中需要字符串而不是文件的url

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-11-26
              • 1970-01-01
              • 2020-11-09
              • 1970-01-01
              • 2010-11-04
              • 1970-01-01
              • 2015-08-08
              • 1970-01-01
              相关资源
              最近更新 更多