Java资源作为文件

问题

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

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

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


#1 热门回答(92 赞)

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

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

#2 热门回答(54 赞)

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

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

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

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


#3 热门回答(50 赞)

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

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

希望有所帮助。