2

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

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 上运行我的代码并将这个资源文件与项目一起移动,所以我不必指定绝对路径来访问它,而是指定相对于我的项目的路径。

我读过这个问题,但无法将其应用于我的案例:Java 中项目文件夹的绝对路径

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

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

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

8 回答 8

4

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

  • 将资源放在类路径中

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

  • 创建用户数据目录

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

于 2013-08-09T14:00:23.507 回答
2

您可以使用 getResource/AsResource 来处理对于classloader的路径。

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

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

您还可以查看另一个适用于相对于 .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/您的类路径中。

于 2013-08-09T13:57:03.517 回答
2

运行代码时,任何相对路径都将连接到当前目录。因此,如果您从项目目录运行代码,则可以将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));
    // ...
}
// ...
于 2013-08-09T14:00:53.810 回答
0

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

于 2013-08-09T13:58:08.673 回答
0

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

CSVReader reader = new CSVReader(new InputStreamReader(getClass().getResourceAsStream("250.csv")));
于 2013-08-09T14:02:11.703 回答
0

您应该使用资源加载器:

this.getClass().getClassLoader().getResourceAsStream("250.csv");
于 2013-08-09T14:00:19.590 回答
0

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

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

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

getClass().getClassLoader().getResourceAsStream("yourFileName");
于 2013-08-09T14:00:25.180 回答
0
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

于 2016-03-26T20:37:33.220 回答