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

标签 java file-io classpath classloader absolute-path

我使用的是 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 时,它不包含文件位置的绝对路径系统,也许这就是读者代码正在寻找的东西。

最佳答案

您使用来自类加载器的资源。

而不是做:

InputStream istream = this.getClass().getClassLoader().getResourceAsStream("config.xml");

做:

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

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

您至少知道资源存在:如果不存在,.getResource{,AsStream}() 都返回 null(而不是抛出 IOException,这是值得怀疑的恕我直言)

关于java - 如何从 InputStream 获取 Java 文件的绝对路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17329924/

相关文章:

java - 从哈希集中生成可能的无序组合对

python - 使用 for 循环读取文件时跳过一行

java - maven、eclipse 和 wtp 无缘无故坏掉了 : it stopped putting the mvn depentent jars in the WEB-INF/lib

java - 用于可选参数的 Mockito ArgumentCaptor

java - 从坐标获取随机位置

c# - 获取最近的 N 个文件并删除其余文件

c++ - 读/写同一个文件(获取 gmon.out)

java - 从 IntelliJ Idea 运行 Maven 目标时使用 IntelliJ Idea 模块类路径

java - 如何将资源目录的路径添加到可执行jar

java - 如何在类路径中找到隐藏的jar?