在 Java 中有没有一种方法可以在通过类加载器从 jar 检索到的资源上构造一个 File实例?
File
我的应用程序使用来自 jar (默认)或运行时指定的文件系统目录(用户输入)的一些文件。我一直在寻找一种 A)以流的形式加载这些文件 B)分别列出用户定义目录或 jar 中的目录中的文件
编辑: 显然,理想的方法是完全远离 java.io.File。有没有一种方法可以从类路径加载一个目录并列出它的内容(其中包含的文件/实体) ?
java.io.File
试试这个:
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
有更多的方法可供选择,例如: Http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
ClassLoader.getResourceAsStream和 Class.getResourceAsStream无疑是加载资源数据的方法。但是,我不认为有任何方法可以“列出”类路径元素的内容。
ClassLoader.getResourceAsStream
Class.getResourceAsStream
在某些情况下,这可能是不可能的——例如,ClassLoader 可以根据请求的资源名称动态生成数据。如果您查看 ClassLoader API (基本上就是类路径机制的工作方式) ,您将看到没有任何事情可以做您想要做的。
ClassLoader
如果您知道实际上已经得到了一个 jar 文件,那么可以用 ZipInputStream加载该文件以查找可用的内容。这将意味着目录和 jar 文件的代码将不同。
ZipInputStream
如果文件是首先单独创建的,另一种方法是包含一种包含可用资源列表的清单文件。将它打包到 jar 文件中,或者将它作为文件包含在文件系统中,然后在向用户提供资源选择之前加载它。
我也有同样的问题,所以我可以使用以下方法:
// 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()
这是一个选择: http://www.uofr.net/~greg/java/get-resource-listing.html
这是我的一个应用程序中的一段代码..。 如果你需要,请告诉我。 如果您知道要使用的文件,则可以使用它。
URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png"); File imageFile = new File(defaultImage.toURI());
希望能帮上忙。
在从 jar 检索到的资源上构造 File 实例的一种可靠方法是将资源作为流复制到临时 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; } }