为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2021-11-24 15:05:05
我试图让自己熟悉 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 中,但是我应该如何声明路径以使其工作?
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

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


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


不要忘记在 finally 块中或使用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);

          }

       }

    }

}


查看完整回答
反对 回复 2021-11-24
  • 1 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信