Java 资源作为文件

Java 资源作为文件

IT小君   2021-09-15T07:57:58

Java 中有没有办法在File通过类加载器从 jar 检索的资源上构造实例?

我的应用程序使用 jar(默认)或运行时指定的文件系统目录(用户输入)中的一些文件。我正在寻找一种一致的方法
a) 将这些文件作为流加载
b) 分别列出用户定义目录或 jar 中的目录中的文件

编辑:显然,理想的方法是java.io.File完全远离有没有办法从类路径加载目录并列出其内容(其中包含的文件/实体)?

服务器费用不足...
评论(6)
IT小君

我遇到了同样的问题,并且能够使用以下内容:

// Load the directory as a resource
URL dir_url = ClassLoader.getSystemResource(dir_path);
// Turn the resource into a File object
File dir = new File(dir_url.toURI());
// List the directory
String files = dir.list()
2021-09-15T07:57:58   回复
IT小君

ClassLoader.getResourceAsStream并且Class.getResourceAsStream绝对是加载资源数据的方法。但是,我认为没有任何方法可以“列出”类路径元素的内容。

在某些情况下,这可能根本不可能——例如,aClassLoader 可以根据它要求的资源名称动态生成数据。如果您查看ClassLoaderAPI(这基本上是类路径机制的工作原理),您会发现没有任何东西可以做您想做的事情。

如果你知道你实际上有一个 jar 文件,你可以加载它ZipInputStream以找出可用的内容。不过,这意味着您将拥有不同的目录和 jar 文件代码。

一种替代方法是,如果首先单独创建文件,则包括一种包含可用资源列表的清单文件。将其捆绑在 jar 文件中或将其作为文件包含在文件系统中,并在为用户提供资源选择之前加载它。

2021-09-15T07:57:59   回复
IT小君

这是我的一个应用程序中的一些代码......让我知道它是否适合您的需求。如果您知道要使用的文件,则可以使用它。

URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());

希望有帮助。

2021-09-15T07:57:59   回复
IT小君

在从 jar 检索的资源上构造 File 实例的一种可靠方法是将资源作为流复制到临时文件中(当 JVM 退出时临时文件将被删除):

public static File getResourceAsFile(String resourcePath) {
    try {
        InputStream in = ClassLoader.getSystemClassLoader().getResourceAsStream(resourcePath);
        if (in == null) {
            return null;
        }

        File tempFile = File.createTempFile(String.valueOf(in.hashCode()), ".tmp");
        tempFile.deleteOnExit();

        try (FileOutputStream out = new FileOutputStream(tempFile)) {
            //copy stream
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        return tempFile;
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}
2021-09-15T07:57:59   回复
IT小君

尝试这个:

ClassLoader.getResourceAsStream ("some/pkg/resource.properties");

还有更多可用的方法,例如,请参见此处:http : //www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html

2021-09-15T07:57:59   回复
IT小君
2021-09-15T07:58:00   回复