问题描述:

一、使用使用相对路径的程序开发环境运行没问题,打成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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐