我有一个位于项目目录中的文件:
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";
答案 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