如何在不指定绝对目录的情况下打开文件?

时间:2013-08-09 13:53:56

标签: java

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

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";

8 个答案:

答案 0 :(得分:4)

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

  • 将资源放在类路径

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

  • 创建用户数据目录

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

答案 1 :(得分:2)

您可以使用getResource / AsResource同时使用路径 relative classloader

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/中的文件位于类路径中。

答案 2 :(得分: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));
    // ...
}
// ...

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您应该使用资源加载器:

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

答案 5 :(得分:0)

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

String path = System.getProperty("user.dir");
编辑:我误解了你的要求:

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

URL fileURL= yourClassName.class.getResource("yourFileName.extension");
String myURL= fileURL.toString();

现在您不需要长路径名称PLUS这个是动态的,即您现在可以将项目移动到任何PC,任何驱动器。
这是因为它通过使用您的CLASS位置而不是任何静态位置访问URL(例如c:\ folder \ ab.mp3,如果您移动到D驱动器,则无法访问该文件,因为您必须更改为D:手动/folder/ab.mp3本质上是静态的)
(注意:只需将该文件保存在您的项目中)

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