有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我的库不能访问它的资源?

我有一个读取文件的类:

package classlibrary;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;

public class ReadingResource {
    public static String readResource() throws IOException {
        URL resource = ClassLoader.getSystemClassLoader().getResource("classlibrary/test_file.txt");
        BufferedReader br = new BufferedReader(new FileReader(resource.getPath()));
        return br.readLine();
    }
}

资源文件位于该类所在的同一目录中。 我用这个类和这个文件建立了一个库

现在我想在另一个类中使用它:

package uritesting;

import classlibrary.ReadingResource;
import java.io.IOException;

public class URITesting {
    public static void main(String[] args) throws IOException {
        System.out.println(ReadingResource.readResource());
    }
}

当我做出决定的时候。jar文件出了这个类,设置该类为主类,添加。我得到一个FileNotFoundException,表示类ReadingResource找不到指定的文件。这很有趣,因为在异常消息中指定的路径实际上是文件的正确路径

您可以找到文件here

编辑: 我用NetBeans开发了这个项目。当我在那里运行时,它运行良好。在这种情况下,类路径是不同的。它同时包含URITestingProjectReadingResource的资源

但是,当我将其作为独立JAR运行时,类路径只包含URITestingProject。对我来说奇怪的是,它没有抱怨没有找到类ReadingResource。这意味着它已加载,尽管它不在类路径中:/


共 (1) 个答案

  1. # 1 楼答案

    问题是resource.getPath()。不可能在jar文件内、在另一台服务器上计算对文件读取器有效的路径等等。但是,您可以通过流获取数据:

        InputStream data = ClassLoader.getSystemClassLoader().getResourceAsStream("classlibrary/test_file.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(data, "utf-8"));
    

    作为旁注:使用reader阅读时,最好指定编码: