在Java中是否有办法在通过类加载器从jar检索的资源上构造File实例?
我的应用程序使用jar中的一些文件(默认)或运行时指定的文件系统目录(用户输入)。我正在寻找一种一贯的方式
a)将这些文件作为流加载
b)分别列出用户定义目录中的文件或jar中的目录
编辑:显然,理想的方法是完全远离java.io.File。有没有办法从类路径加载目录并列出其内容(包含在其中的文件/实体)?
答案 0 :(得分:97)
我遇到了同样的问题,并且能够使用以下内容:
// 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()
答案 1 :(得分:57)
ClassLoader.getResourceAsStream
和Class.getResourceAsStream
绝对是加载资源数据的方法。但是,我不相信有任何方法可以“列出”类路径元素的内容。
在某些情况下,这可能根本不可能 - 例如,ClassLoader
可以根据要求的资源名称动态生成数据。如果您查看ClassLoader
API(基本上是类路径机制的工作原理),您将看到没有任何内容可以执行您想要的操作。
如果您知道自己确实有一个jar文件,可以使用ZipInputStream
加载该文件,以找出可用的内容。这意味着你将拥有不同的目录和jar文件代码。
另一种方法是,如果首先单独创建文件,则包含一种包含可用资源列表的清单文件。将其捆绑在jar文件中或将其作为文件包含在文件系统中,并在为用户提供资源选择之前加载它。
答案 2 :(得分:54)
以下是我的一个应用程序的一些代码...... 如果它符合您的需求,请告诉我。 如果您知道要使用的文件,则可以使用此方法。
URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());
希望有所帮助。
答案 3 :(得分:10)
在从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;
}
}
答案 4 :(得分:4)
试试这个:
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
有更多可用的方法,例如看这里: http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
答案 5 :(得分:2)