Java中的文件路径(Linux)

4
我创建了一个Java应用程序,从位于src/文件夹中的conf.properties文件中加载一些配置。在Windows上运行此应用程序时,它可以正常工作。然而,当我尝试在Linux上运行它时,会抛出以下错误:
java.io.FileNotFoundException: src/conf.properties (No such file or directory)

你能展示相关的代码吗? - OscarRyz
来自Myles答案中的评论: 这是文件名:public static final String PROP_FILENAME = "src / conf.properties"; - Jay R.
9个回答

6
如果您已将应用程序打包到一个包含属性文件的jar文件中,您应该使用下面的方法。这是分发Java程序的标准方式。
URL pUrl = this.getClass().getResource("/path/in/jar/to/file.properties");

Properties p = new Properties();
p.load(pUrl.openStream());

路径中的/指向jar文件中的根目录。


感谢Bjorn和大家的回复。我刚刚用WinRAR解压了JAR文件,发现根本没有src/目录,而是所有src/目录下的内容都在根目录中。我不知道JAR会改变这样的结构。我只是按照Bjorn提到的方法设置了路径为“/conf.properties”,然后一切都开始正常工作了。再次感谢。 - craftsman
1
当使用jar打包时,您的目录结构不应更改。也许您的IDE中有一些设置会移动文件? - Björn
1
我正在使用Eclipse,从未触碰过任何此类设置。它是一个独立的应用程序,并且我将其导出为可运行的JAR文件。但是我会找出Eclipse如何提供这样的设置。 - craftsman

5

4
我还会检查您当前的工作目录是否与文件路径相关。 您只需要创建一个File test = new File(“。”);然后打印该文件的规范路径名。
如果您使用System.getProperty()引用任何其他位置,例如user.dir或类似内容,则至少要验证您正在使用的相对根目录是否是您认为的位置。
另外,正如Myles所指出的那样,请检查用作文件路径分隔符的斜杠。 虽然您始终可以使用“/”,但这也是有问题的。
如果您绝对引用路径,则在两个操作系统之间转换时可能会遇到麻烦,如果像硬编码位置一样做某些愚蠢的事情。

+1:问题在于他正在使用相对路径,因此依赖于当前工作目录。 - BalusC

2
你需要做的是检查 System.getProperties() 并查找 file.separator。静态的File.pathSeprator也可以帮你达到目的。
这将允许你构建一个在任何系统上都能本地化的路径。
(如果确实存在问题。有时候我想获取当前目录,只是为了确认我认为我运行的目录和我真正运行的目录是一致的。)

2

检查您的权限。如果您(或者更确切地说,Java进程正在运行的用户)没有适当的读取文件权限,那么您将会收到此错误消息。

这是一个典型的Windows -> Linux迁移问题。在提示符下运行 ls -l src / conf.properties 时,显示什么?

此外,请检查大小写。 Windows不区分大小写,因此如果文件实际上被称为例如CONF.properties,则仍将找到该文件,而在Linux上,两个文件将被视为不同的文件。


1
我会检查一下你的斜杠,因为Windows通常使用'\'而Linux使用'/'来表示文件路径。
编辑:既然你的路径看起来没问题,那么可能是文件权限或应用程序执行路径不同?

这是文件名:public static final String PROP_FILENAME="src/conf.properties"; - craftsman
1
在Java中,'/'甚至在Windows系统上也能很好地工作,事实上Visual C++同样也会将'/'作为分隔符处理。 - ypnos
同意,但是在Windows下''也很好用,在Linux下就不行了。 - Myles

1

您应该检查应用程序的工作目录。也许它不是您所假设的那个,这就是为什么 'src' 目录不存在的原因。

一个简单的检查方法是尝试绝对路径(仅供调试使用!)。


1

检查你的斜杠和冒号,在我的情况下,我将我的PS1设置为以下值

PS1='\n[\e[1;32m]$SYSNAME(\u)@[\e[1;33m]\w [\e[1;36m](\d \T) [!]\e[0m]\n\$ '

我正在尝试从env中读取,例如system.getenv

Java抛出异常

java.lang.IllegalArgumentException: Malformed \uxxxx encoding


0

试试双斜杠,在做JBoss的事情之后,我经常需要重构我的代码以使用双斜杠


2
如果您在Windows路径中使用\,则需要\进行转义,因为\是转义字符。如果您使用/,则不需要进行转义。 - Jay R.
谢谢提供额外的信息,我是在JBoss环境下进行开发和使用时遇到了一些问题和挑战。 :) - Woot4Moo

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