Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不指定绝对目录的情况下打开文件?_Java - Fatal编程技术网

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

Java 如何在不指定绝对目录的情况下打开文件?,java,Java,我有一个文件位于我的项目目录中: src/test/resources/250.csv 这是需要它的代码: CSVReader reader = new CSVReader(new FileReader(FILE_PATH)); 文件路径应为字符串 我如何改变这条道路: final String FILE_PATH = "C:\\Users\\Kowalski\\Desktop\\test-master\\test1\\src\\test\\resources\\250.csv" 变成更可

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

src/test/resources/250.csv
这是需要它的代码:

CSVReader reader = new CSVReader(new FileReader(FILE_PATH));
文件路径应为
字符串

我如何改变这条道路:

final String FILE_PATH = "C:\\Users\\Kowalski\\Desktop\\test-master\\test1\\src\\test\\resources\\250.csv"
变成更可靠、更相对的东西

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

我读了这个问题,但无法将其应用到我的案例中:

编辑:我有4个星期的经验,我认为自己对语言

真的很陌生。 编辑:这是公认答案的解决方案:

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

您可以使用getResource/AsResource来处理相对于类加载器的路径

路径应该相对于类加载器的类路径根。你可以在这里观看

您还可以查看另一个变量,它使用相对于.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/
中的文件在您的类路径上。

看看这个方法。它将尝试在类路径中查找命名资源。假设您使用的是maven,则
src/main/resources
中的任何内容都将位于类路径上并将被找到。

您应该使用资源加载器:

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

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

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

  • 创建用户数据目录

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

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

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

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

运行代码时,任何相对路径都将连接到当前目录。因此,如果从项目目录运行代码,可以将
文件\u 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));
    // ...
}
// ...

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

CSVReader reader = new CSVReader(new InputStreamReader(getClass().getResourceAsStream("250.csv")));
现在您不需要长路径名,而且这个路径名本质上是动态的,即,您现在可以将项目移动到任何pc或任何驱动器。
这是因为它通过使用您的类位置而不是任何静态位置来访问URL(例如c:\folder\ab.mp3,如果您移动到D驱动器,则无法访问该文件,因为您必须手动更改为D:/folder/ab.mp3,这本质上是静态的)
(注意:只需将该文件与项目一起保存)

您可以使用fileURL作为:File File=new File(fileURL.toURI())

您可以将myURL用作:媒体音乐文件=新媒体(myURL)//在javaFX中,需要字符串而不是文件的url

您也希望此资源文件可编辑吗?不,我不希望它可编辑。或者使用相对parh,通过查看工作目录可以工作我不知道什么是类加载器这是搜索的关键字。看看新的答案。我把这段代码放在哪里?你能把它放在某种上下文中吗?谢谢,但是文件路径需要是一个字符串,我试着把文件f转换成字符串,但什么也没有发生。这是迄今为止最好的解释,而且实现起来非常简单
CSVReader reader = new CSVReader(new InputStreamReader(getClass().getResourceAsStream("250.csv")));
URL fileURL= yourClassName.class.getResource("yourFileName.extension");
String myURL= fileURL.toString();