当前位置:  开发笔记 > 编程语言 > 正文

Java资源作为文件

如何解决《Java资源作为文件》经验,为你挑选了4个好方法。

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

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

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



1> Chris Conway..:

我有同样的问题,并能够使用以下内容:

// 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()


此方法不适用于类路径中的JAR,仅适用于文件和目录

2> Jon Skeet..:

ClassLoader.getResourceAsStream并且Class.getResourceAsStream绝对是加载资源数据的方法.但是,我不相信有任何方法可以"列出"类路径元素的内容.

在某些情况下,这可能根本不可能 - 例如,a ClassLoader 可以根据要求的资源名称动态生成数据.如果你看一下ClassLoaderAPI(基本上是类路径机制的工作方式),你会发现没有任何东西可以做你想要的.

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

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


我同意它很烦人 - 但它使ClassLoader在其他方面更广泛适用.例如,编写"web类加载器"很容易,因为Web适用于获取文件,但它通常不会*列出*文件.

3> 小智..:

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

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

希望有所帮助.



4> 小智..:

在从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;
    }
}

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有