gpt4 book ai didi

java - 从打包为 jar 文件的 java 程序中的资源中提取图像

转载 作者:行者123 更新时间:2023-12-02 08:59:20 26 4
gpt4 key购买 nike

我有一个从磁盘读取图像资源的java程序。

这在使用 mvn exec:java 进行测试时效果很好.

但是,当程序以 mvn packaged 打包时,它会抛出以下错误:

java.nio.file.FileSystemNotFoundException

<小时/>

项目结构

├── java
│   └── com
│   ├── aaa
│   │   ├── bbb
│   │   │   ├── AssemblingTags.java
│   │   │   ├── BatchLifeCycle.java
│   │   │   ├── config
│   │   │   │   ├── AssemblingTagsConfig.java
│   │   │   │   ├── Configuration.java
│   │   │   │   ├── DatabaseConfig.java
│   │   │   │   ├── ExecutionContext.java
│   │   │   │   ├── InjectionTagsConfig.java
│   │   │   │   ├── QualityConfig.java
│   │   │   │   └── TraceabilityContext.java
│   │   │   ├── Database.java
│   │   │   ├── DeviceLifeCycle.java
│   │   │   ├── Devices.java
│   │   │   ├── InjectionTags.java
│   │   │   ├── QRCode.java
│   │   │   ├── Quality.java
│   │   │   ├── Simulator.java
│   │   │   ├── ThreadManager.java
│   │   │   ├── TimeManager.java
│   │   │   └── Utils.java
│   │   └── traceability
│   │   └── Tracer.java
│   └── example
│   ├── AdminAPI.java
│   ├── ConfigAPI.java
│   ├── CORSFilter.java
│   ├── DeviceAPI.java
│   ├── Main.java
│   ├── QrCodeAPI.java
│   ├── ToggleAPI.java
│   └── TracerAPI.java
└── resources
└── images
└── strioscopy
├── v1-2.png
├── v1-3.png
├── v2-1.png
└── v2-2.png
<小时/>

读取图像的代码

注意打印。

try {
System.out.println("images/" + type + "/" + name); <-- PRINT 1
URL res = getClass().getClassLoader().getResource("images/" + type + "/" + name);
System.out.println(res); <-- PRINT 2
File file = Paths.get(res.toURI()).toFile();
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();
return Response.ok(data).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError().entity(e).build();
}
<小时/>

当使用mvn exec:java时,它可以工作并打印:

images/strioscopy/v1-3.png 
file:/home/hduser/program/target/classes/images/strioscopy/v1-3.png

使用 jar ( java -jar myprogram-jar-with-dependencies.jar ) 执行时,失败并打印:

images/strioscopy/v1-3.png

jar:file:/home/hduser/program/target/myprogram-jar-with-dependencies.jar!/images/strioscopy/v1-3.png
<小时/>

根据我的理解,它无法从 jar 中读取图像(因为它是“jared”)。 但是如何解决这个问题呢?

此外,请注意这里的感叹号:(V 形之间)jar:file:/home/hduser/program/target/myprogram-jar-with-dependencies.jar>>!<</images/strioscopy/v1-3.png

正常吗?

最佳答案

无论出于何种原因,它都会通过以下代码给出预期结果:

try {
System.out.println("images/" + type + "/" + name);
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("images/" + type + "/" + name);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = is.read(data,0,data.length)) != -1) {
baos.write(data, 0, nRead);
}
baos.flush();
byte[] ba = baos.toByteArray();
return Response.ok(ba).build();
} catch (Exception e) {
e.printStackTrace();
return Response.serverError().entity(e).build();
}

但是,我无法解释原因。 (如果有人能阐明这一点,欢迎!)

关于java - 从打包为 jar 文件的 java 程序中的资源中提取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60283291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com