gpt4 book ai didi

java - 使用可执行 jar 中的资源文件

转载 作者:行者123 更新时间:2023-12-02 10:41:58 26 4
gpt4 key购买 nike

我正在尝试熟悉 Maven 并为此创建了一个测试项目。我创建了一个简单的类,它只打印从 .txt 文件读取的一些内容。我的主类如下所示:

public class HelloWorld {
public static void main(String[] args) throws IOException {
String filePath = HelloWorld.class.getClassLoader().getResource("test.txt").getFile();

BufferedReader br = new BufferedReader(new FileReader(filePath));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
}

我创建了一个资源文件夹,将其标记为资源根,修改了资源模式并从我的项目中打包了一个可执行的 jar。我的项目结构如下所示:

Quickstart
├───.idea
├───src
│ ├───main
│ │ ├───java
│ │ │ └───de
│ │ │ └───mb
│ │ │ └───hello
| | | └───HelloWorld.java
│ │ └───resources
| | └───test.txt

现在我的问题是,当我尝试执行我的 jar 时,出现以下错误:

Exception in thread "main" java.io.FileNotFoundException:   
file:\C:\Users\mb\IdeaProjects\Quickstart\target\Quickstart-1.
0-SNAPSHOT.jar!\test.txt (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
at de.mb.hello.HelloWorld.main(HelloWorld.java:15)

我猜问题是,.txt 文件位于 .jar 内,但是我应该如何声明路径才能使其工作?我已经尝试使用不同的方法来获取我的资源路径,但没有成功并修改了我的 pom.xml:

<project>
...
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.txt</include>
</includes>
</resource>
</resources>
...
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>de.mb.hello.HelloWorld</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

更新:按照建议,我更改了代码以使用 getResourceAsStream() 而不是 getResource(),它的工作原理如下:

public static void main(String[] args) {
try {
InputStream in = HelloWorld.class.getClassLoader().getResourceAsStream("test.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(in));
try {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} finally {
in.close();
br.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

最佳答案

打包在 jar 文件中的资源不是文件,而是 zip 文件中的一系列字节。它必须被处理有一个字节流。

使用 getResourceAsStream(...) 而不是 getResource(...) 来获取 InputStream 而不是 File,并使用 InputStreamReader 而不是 FileReader 读取内容。

不要忘记在finally block 中或使用try-with-resources关闭资源.

类似的事情:

public class HelloWorld {
public static void main(String[] args) throws IOException {
try(BufferedReader br = new BufferedReader(new InputStreamReader(HelloWorld.class.getClassLoader().getResourceAsStream("test.txt")))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}

关于java - 使用可执行 jar 中的资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52861845/

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