IDEA运行正常,jar包报路径未找到java.io.FileNotFoundException:

文章讲述了在Java程序中,使用相对路径运行正常,但打包成jar后出现路径找不到的问题。作者尝试了多种获取类路径的方法,发现通过File无法读取jar内的资源。最终,通过使用ClassLoader.getSystemResourceAsStream()方法成功读取jar包中的资源。然而,对于资源的写入,作者表示没有直接的方法,建议将读取的内容写入新的磁盘文件进行操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

一、使用使用相对路径的程序开发环境运行没问题,打成jar包之后报路径未找到错误( java.lang.RuntimeException: java.io.FileNotFoundException: )

二、修改程序使用ClassLoader.getSystemResource(“资源名”).getPath()等方法后,报 java.io.FileNotFoundException: file:\F:\code\xinxiyincan\out\production\xinxiyincan\src\resources\4_1.bmp (文件名、目录名或卷标语法不正确。)错误

三、修改程序使用其他获取类路径的方法,使得打成jar包之后的路径是正确的jar包内的路径后仍然报错

问题解决

jar包是一个压缩包,他有特定的协议格式,通过url是不能定位他内部的资源的,所以我在问题描述中所作的所有努力都是白费。通过查阅其他大佬的文章(文章链接我会放到本文末尾),我才知道,想要读取jar包中的资源,使用File的方式是不可能的,即通过路径创建io流的方式是不可能读取jar包中的资源的。

那么要怎样才能读取jar包中的资源呢?

我通过以下方式访问成功:

ClassLoader.getSystemResourceAsStream("data");
该方法的放回值是inputStream,传入参数是你的资源名,此方法会到你的classpath路径下去查找资源,我们知道resources就是默认的classpath,所以我们可以把我们的资源文件放到resources目录下:

在这里插入图片描述

使用上述方法返回的inputStream,我们就可以读取资源文件了。

以上我们了解了如何读取资源,那么如何实现数据写入呢?

根据我研究一天的结论来说,没有可以实现数据写入的方法(如果您知道写入方法的话,评论区请不吝赐教,万分感谢)。但是,我们可以通过将刚才读取的数据写入到磁盘的另外位置,通过操作新文件,也能使得程序正常运行(也就是说,我们只读取一次jar包中的资源,备份后就直接操作我们备份后的数据即可)

测试代码:

 public static void main(String[] args) throws IOException {
        //获取流,读取资源文件
        InputStream data = ClassLoader.getSystemResourceAsStream("data");
        byte[]bytes = new byte[8];
        int count = 0;
        //读取的文件内容,放到data1中
        FileOutputStream fileOutputStream = new FileOutputStream("data1");
        while((count = data.read(bytes))!=-1){
            fileOutputStream.write(bytes,0,count);
        }
        //测试可以从data1中正常读写数据(写在上面已经测试,下面测试读取)
        FileInputStream data1 = new FileInputStream("data1");
        while((count = data1.read(bytes))!=-1){
            System.out.println(count);
        }
        data.close();
        fileOutputStream.flush();
        fileOutputStream.close();
    }
在这里插入代码片

注:

关于如何设置一个文件夹为resources:

在这里插入图片描述
在这里插入图片描述
参考文章(跪谢大佬):
https://blog.csdn.net/B_H_L/article/details/7767829
https://puhaiyang.blog.csdn.net/article/details/77409203
https://blog.csdn.net/B_H_L/article/details/7767829

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值