Answers:
ClassLoader.getResourceAsStream
并且Class.getResourceAsStream
绝对是加载资源数据的方法。但是,我不相信有任何“列出”类路径元素内容的方法。
在某些情况下,这可能根本不可能-例如,a ClassLoader
可以根据要求的资源名称即时生成数据。如果看一下ClassLoader
API(基本上是类路径机制的工作原理),您会发现没有任何事情可以做。
如果您知道确实有一个jar文件,可以将其加载ZipInputStream
以查找可用的文件。这将意味着您将为目录和jar文件使用不同的代码。
如果首先分别创建文件,则一种替代方法是包括一种清单文件,其中包含可用资源列表。将其捆绑在jar文件中或将其作为文件包含在文件系统中,并在为用户提供选择资源之前加载它。
InputStream
那么从getResourceAsStream
站点获取的资源将在该大小后检索该字节,如果包含在压缩文件系统(如jar)中,则返回0。getResource
在这种情况下,您似乎被迫独立使用和加载文件。
read
决定读取多少数据的方法(我不知道这一点)。如果正在读取的文件位于常规文件夹中,则似乎已读取了整个文件。如果该文件由于已打包而位于jar中,则仅读取其中的一部分。
InputStream
,如果要读取整个资源,则应循环执行直到read
返回-1。
我遇到了同样的问题,可以使用以下内容:
// 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()
FileSystem
对象并从中获取对象Path
。然后,您可以像平常一样阅读它。(见stackoverflow.com/a/22605905/1876344)
这是我的一个应用程序中的一些代码...让我知道它是否适合您的需求。如果知道要使用的文件,则可以使用此文件。
URL defaultImage = ClassA.class.getResource("/packageA/subPackage/image-name.png");
File imageFile = new File(defaultImage.toURI());
希望有帮助。
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;
}
}
试试这个:
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
有更多可用的方法,例如,请参见此处:http : //www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html