Java打jar包后如何获取resource中的文件

本文通过一个具体的代码示例,展示了在Java中读取jar包内资源文件时遇到的问题及其解决方案。原始代码在打包成jar后无法正确读取test.txt文件,报FileNotFoundException。修正后的代码利用InputStream资源流成功解决了这个问题,无论在IDEA中运行还是jar包执行,都能正确获取文件内容。修正关键在于使用getResourceAsStream()方法代替getResource()。

假设有如下目录结构的代码,现在想要获取test.txt文件中的内容,test.txt中的内容为hello world。

问题代码如下:

package mvnDemo;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class MvnDemo {

    public static void main(String[] args) throws IOException {
        System.out.println(StringUtils.upperCase("hello mvn"));
        String path = MvnDemo.class.getClassLoader().getResource("test.txt").getPath();
        String testString = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);
        System.out.println(testString);
    }
}

结果如下:

hello world

但打成jar包执行后,却会报错如下:

D:\>java -jar D:\testDemo-1.0-SNAPSHOT.jar
Exception in thread "main" java.io.FileNotFoundException: file:\D:\testDemo-1.0-SNAPSHOT.jar!\test.txt (文件名、目录名或卷标语法不正确。)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at org.apache.commons.io.FileUtils.openInputStream(FileUtils.java:2388)
        at org.apache.commons.io.FileUtils.readFileToString(FileUtils.java:2506)
        at mvnDemo.MvnDemo.main(MvnDemo.java:15)

正确代码如下:

package mvnDemo;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class MvnDemo {

    public static void main(String[] args) throws IOException {
        System.out.println(StringUtils.upperCase("hello mvn"));
        InputStream resourceAsStream = MvnDemo.class.getClassLoader().getResourceAsStream("test.txt");
        List<String> stringList = IOUtils.readLines(resourceAsStream, StandardCharsets.UTF_8);
        String testString = StringUtils.join(stringList, "");
        System.out.println(testString);
    }
}

这种方式处理,无论在idea中执行,还是打包执行,都能获取预期的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值