Java资源作为文件
在Java中通过类加载器从jar中获取的资源上构buildFile实例有没有办法?
我的应用程序使用jar(默认)或运行时(用户input)指定的文件系统目录中的一些文件。 我正在寻找一个一致的方式
a)以stream的forms加载这些文件
b)将这些文件分别列在用户定义的目录或jar中的目录中
编辑:显然,理想的做法是远离java.io.File完全。 有没有办法从类path加载一个目录,并列出其内容(其中包含的文件/实体)?
ClassLoader.getResourceAsStream
和Class.getResourceAsStream
绝对是加载资源数据的方法。 但是,我不相信有什么方法可以“列出”类path元素的内容。
在某些情况下,这可能根本不可能 – 例如, ClassLoader
可以根据请求的资源名称,即时生成数据。 如果你看一下ClassLoader
API(基本上是类path机制的工作原理),你会发现没有什么可以做的。
如果你知道你实际上有一个jar文件,你可以用ZipInputStream
加载它来找出可用的东西。 这将意味着你将有不同的目录和jar文件的代码。
另一种方法是,如果文件是首先单独创build的,则应包括一个包含可用资源列表的清单文件。 捆绑在jar文件中,或者将其作为文件包含在文件系统中,并在为用户提供资源select之前加载它。
我有同样的问题,并能够使用以下内容:
// 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()
下面是我的一个应用程序的一些代码…让我知道它是否适合您的需求。 如果您知道要使用的文件,则可以使用它。
URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png"); File imageFile = new File(defaultImage.toURI());
希望有所帮助。
在从jar中获取的资源上构buildFile实例的可靠方法是将资源作为stream复制到临时文件(当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; } }
尝试这个:
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
有更多的方法可用,例如在这里看到: http : //www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
这是一个选项: http : //www.uofr.net/~greg/java/get-resource-listing.html