如何在Java中指定文件路径?

7

我已经为“Debian Linux”创建了一个Java应用程序。现在我希望该应用程序读取放置在指定jar文件所在目录中的文件。那么在File对象的参数中应该指定什么?

File fileToBeReaded = new File(...);

如何指定参数来表示应用程序的jar文件所在的相对文件路径?


标题或许应该是“如何在Java中找到我的程序安装的位置?” - Tuure Laurinolli
1
没错,那正是我想要的。谢谢你的投票。 - Juri
6个回答

9

你是在问转义字符的问题吗?

如果是这种情况,请使用正斜杠代替反斜杠,例如:

"C:/Users/You/Desktop/test.txt"

而不是

"C:\Users\You\Desktop\test.txt"


8
如果您知道文件的名称,那当然很简单。
new File("./myFileName")

如果您不知道文件名,可以使用File对象的list()方法获取当前目录中的文件列表,然后选择您想要的文件。


5
java.io.File中使用相对路径是完全依赖于当前工作目录的。这与执行JAR文件的方式有所不同。例如,如果您在/foo中,并通过java -jar /bar/jar/Bar.jar执行JAR,则工作目录仍然是/foo。但是,如果您cd/bar/jar并执行java -jar Bar.jar,则工作目录是/bar/jar
如果您想要JAR文件所在的根路径,其中一种方法是:
File root = new File(Thread.currentThread().getContextClassLoader().getResource("").toURI());

此方法返回JAR文件的根路径(即类路径根目录)。如果您将资源相对于类路径根目录放置,可以按以下方式访问它:

File resource = new File(root, "filename.ext");

或者您也可以直接使用以下方式:

File resource = new File(Thread.currentThread().getContextClassLoader().getResource("filename.ext").toURI());

你能否建议使用.war文件而不是.jar文件。当应用程序部署在jboss服务器上时,我发现很难获取图像文件的文件路径。我已经单独提出了一个问题 - https://stackoverflow.com/questions/54161215/how-to-refer-to-a-file-present-within-src-main-resources-folder-deployed-in-a-jb/54161697?noredirect=1#comment95158413_54161697 - Farhan stands with Palestine
1
嘿@Shirgill :) 根据服务器类型,WAR部署通常将单个文件加载到内存中而不是磁盘中。因此,引用WAR打包文件的java.io.File并不总是有效的。在给出答案之前,最好先告诉我们您需要这个File以及为什么InputStream不足够。例如,也许您需要这个文件用于某些第三方API,该API顽固地只接受File而不是InputStream,例如iText PDF。 - BalusC
是的,在构建PDF文件时,我需要创建一个由iText PDF公开的图像对象Image logo = Image.getInstance(path)。 我看到有一个重载方法,它接受一个Inputstream对象。但是,其他要求涉及加载字体文件(阿拉伯语)BaseFont baseNormalFont = BaseFont.createFont(PATH, BaseFont.IDENTITY_H, true);我需要提供相同文件的路径。目前,我已将该文件放在Linux的单独配置文件夹下,然后给出了路径,例如System.getProperty(".....path to the conf folder") + further path to font file - Farhan stands with Palestine
上述方法很有效,但如果文件是Maven项目的一部分,是否可以实现相同的效果呢?请建议。顺便问一下,您是如何特别选择iText的呢?我发现我没有在任何地方提到它 ::)) - Farhan stands with Palestine
1
@Shirgill:因为这个问题之前已经被问过了 :) https://dev59.com/iY7ea4cB1Zd3GeqPCYYK 你的答案也在那里,很可能选项4对你来说是最好的选择。 - BalusC
这非常有见地,感谢您的慷慨。 - Farhan stands with Palestine

3
我认为这应该可以解决问题:
File starting = new File(System.getProperty("user.dir"));
File fileToBeRead = new File(starting,"my_file.txt");

这样,文件将在user.dir属性中搜索,该属性将是您的应用程序的工作目录。


2

您可以向类加载器询问jar包的位置:

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

...但我建议将你要查找的文件放在jar文件中,并将其作为资源读取(getClass().getResourceAsStream( "myFile.txt" ))。


资源不必在JAR文件中 - 您也可以将目录添加到类路径中。 - Tuure Laurinolli

1

在IntelliJ IDEA上右键单击文件,然后复制绝对路径,然后在双引号中粘贴路径作为filePath。 例如,它应该像这样:

"C:\\Users\\NameOfTheComputerUser\\IdeaProjects\\NameOfTheProject\\YourSubFolders\\name-of-the-file.example"

1
这最终成为了我在C# Sikuli4Net中所需要的。 - J_L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接