1

Errr 伙计们,我编写了一些代码来读取 Java 中的简单输入文件,一切正常,但是在签入代码之后,当其他人尝试运行它时,他们的二进制文件找不到文件(即使文件是就在他们的 bin 文件夹中)!

java.io.FileNotFoundException: C:\blah\bin\com\common\PackageRFCs.properties (The system cannot find the path specified)

所以在我的工作区中,我有这些结构和文件:

com.test.test.java
com.common.Utility.java
com.common.PackageRFCs.properties

在我的test.java中,我试图以这种方式读取属性文件:

Class<com.common.Utility> dummy = com.common.Utility.class;
String propURI = dummy.getPackage().getName().replace('.','/') + "/PackageRFCs.properties";
String filepath = ClassLoader.getSystemClassLoader().getResource(propURI).getFile();
...
BufferedReader br = new BufferedReader(new FileReader(filepath));
// do some read line stuff here

上面的代码在我的 Eclipse 下工作得很好,但是当其他人试图运行它时失败了。我想也许我的垃圾箱里有一些悬空的文件,所以我做了一个项目>清理,我仍然能够很好地运行它......我也尝试清理其他用户的工作区,但他们仍然不能阅读文件... WTF是怎么回事?

我无法重现我的问题。

4

1 回答 1

1

如果您有一个 URL,getResource()则不需要将其转换为文件路径并用 a 打开它FileReader(无论如何它都不起作用,因为URL.getFile()它不是本机文件路径,它只是原始 URL 的子字符串)。只需首先使用.openStream()或调用get{System}ResourceAsStream()

BufferedReader br = new BufferedReader(new InputStreamReader(
    ClassLoader.getSystemResourceAsStream(propURI), "ISO-8859-1"));

(我假设为 ISO-8859-1 编码,因为文件已命名.properties,这是 Java 属性文件的标准编码,但如果这是错误的,则更改编码以匹配文件)

但是鉴于您已阐明的结构,使用起来会更健壮

Utility.class.getResourceAsStream("PackageRFCs.properties")

它会自动为您处理包到路径的映射,并且能够处理当您的类由系统类加载器以外的类加载器加载时的情况。

于 2013-04-03T14:47:30.900 回答