如何从InputStream获取Java文件的绝对路径?

20

我正在使用Java 6,我有一个方法来扫描运行时类路径中名为config.xml的文件。如果找到了,我想将文件内容读入一个字符串中:

我目前使用Java 6版本,并编写了一个扫描运行时类路径中名为config.xml的文件的方法。若找到该文件,我希望将其内容读入一个字符串中:

InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");
if(istream != null) {
    System.out.println("Found config.xml!");

    StringBuffer fileData = new StringBuffer(1000);
    BufferedReader reader;
    try {
        reader = new BufferedReader(new FileReader(fileName));
        char[] buf = new char[1024];
        int numRead = 0;
        while((numRead=reader.read(buf)) != -1) {
            String readData = String.valueOf(buf, 0, numRead);
            fileData.append(readData);
            buf = new char[1024];
            reader.close();
        }
    } catch (FileNotFoundException fnfExc) {
        throw new RuntimeException("FileNotFoundException: " + fnfExc.getMessage());
    } catch (IOException ioExc) {
        throw new RuntimeException("IOException: " + ioExc.getMessage());
    }
}
当我运行这段代码时,控制台输出如下:
Found config.xml!
Exception in thread "main" java.lang.RuntimeException: FileNotFoundException: config.xml (No such file or directory)
    at com.me.myapp.Configurator.readConfigFileFromClasspath(Configurator.java:556)
    at com.me.myapp.Configurator.<init>(Configurator.java:34)
    ...rest of stack trace omitted for brevity
所以,config.xml的类路径扫描成功了,但读取器似乎无法找到该文件。为什么? 我唯一的理论是当在类路径上找到config.xml时,它不包含文件系统上文件位置的绝对路径,也许这就是读取器代码正在寻找的内容。

你尝试过使用 this.getClass().getResourceAsStream("config.xml") 吗? - Vishal K
2
为什么不直接从istream读取? - raptortech97
2个回答

39
你使用了ClassLoader中的一个资源。
不要这样做:
InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");

做:

URL url = getClass().getResource("config.xml");

那个URL将具有路径(使用.toURI().getPath())。要随后打开匹配的输入流,请使用.openStream()

您至少知道该资源存在:如果不存在,则.getResource{,AsStream}()都会返回null(而不是抛出IOException,这令人怀疑imho)


你的URL解决方案帮了我大忙,当你无法指定上下文加载器时它能够正常工作。 - Uriel Arvizu
为什么不只使用.getPath()呢? - wyx
@wyx 直到调用 toURI() 方法之前,路径仍然是 URL 编码的。请参见此答案 - takanuva15
9
当尝试访问位于.jar文件中的文件时,.getResource()无法正常工作。 - jcflorezr
@jcflorezr,没错,我同意你的看法。 - excelsiorious

4

从你给出的例子中,不清楚fileName是指什么。你应该直接使用从getResourceAsStream()得到的流来读取文件,大致如下

reader = new BufferedReader(new InputStreamReader(istream));

你应该避免在每个读取循环中重复分配buf,一次就足够了。


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