我的项目中有一个包含238张图像的文件夹。我希望能够找到目录中的所有图像。
我目前正在访问所有这些图片:
File directory = new File(FileNameGuesser.class.getResource(DIRECTORY).getPath());
for (File file : directory.listFiles()) {
// filter, process, etc.
}
这在Eclipse中运行良好。但是,当我导出到jar文件时,FileNameGuesser.class.getResource(DIRECTORY)
会返回C:\Users\...\file.jar!\org\...
(因为它是压缩的,我假设)并且方法会中断。
我怎样才能做到这一点?
编辑:如果可能的话,我想在已部署的jar中找到一个适用于Eclipse 和的解决方案。
答案 0 :(得分:2)
这不是真正可能以任何漂亮和干净的方式。
能够做.getClass().getResources("/pictures/*.jpg")
(或某事)会很高兴,但我们做不到。
你能做的最好就是作弊。如果您知道存储图像的jar文件的名称,则可以使用JarFile
或ZipFile
API来获取列表:
ZipFile zipFile = null;
try {
zipFile = new ZipFile(new File("...")); // Path to your Jar
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
// Here, I've basically looked for the "pictures" folder in the Zip
// You will need to provide the appropriate value
if (!entry.isDirectory() && entry.getName().startsWith("pictures")) {
// Basically, from here you should have the full name of the
// image. You should be able to then construct a resource path
// to the image to load it...
// URL url = getClass().getResource("/" + entry.getName());
System.out.println(entry.getName());
}
}
} catch (Exception exp) {
exp.printStackTrace();
} finally {
try {
zipFile.close();
} catch (Exception e) {
}
}
如果您事先不知道他们的名字,那么更好的解决办法就是不要将这些图像嵌入您的罐子里。
嵌入式资源确实应该事先通过名称告知您的应用程序。
根据AndrewThompson的建议,您可以生成资源列表,将其添加到Jar文件中。在运行时,您将加载此文件并可以访问所有资源。
答案 1 :(得分:0)
您可以使用Spring提供的PathMatchingResourcePatternResolver
。
public class SpringResourceLoader {
public static void main(String[] args) throws IOException {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// Ant-style path matching
Resource[] resources = resolver.getResources("/pictures/**");
for (Resource resource : resources) {
System.out.println("resource = " + resource);
InputStream is = resource.getInputStream();
BufferedImage img = ImageIO.read(is);
System.out.println("img.getHeight() = " + img.getHeight());
System.out.println("img.getWidth() = " + img.getWidth());
}
}
}
我没有对返回的Resource
做任何想象,但是你得到了照片。
将此添加到您的maven依赖项(如果使用maven):
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
这将直接在已部署的jar中的Eclipse / NetBeans / IntelliJ 和中使用。
从IntelliJ内部运行,给出了以下输出:
resource = file [C:\Users\maba\Development\stackoverflow\Q12016222\target\classes\pictures\BMW-R1100S-2004-03.jpg]
img.getHeight() = 768
img.getWidth() = 1024
从带有可执行jar的命令行运行,给出了以下输出:
C:\Users\maba\Development\stackoverflow\Q12016222\target>java -jar Q12016222-1.0-SNAPSHOT.jar
resource = class path resource [pictures/BMW-R1100S-2004-03.jpg]
img.getHeight() = 768
img.getWidth() = 1024