JAVA程序读取JAR包中文件的解决方法

        编写完Java程序后,打包成Jar时发布,会发现找不到Jar文件中的图片和文本文件,其原因是程序中载入图片或文本文件时,使用了以当前工作路径为基准的方式来指定文件和路径。这与用户运行Jar包时的当前工作路径并不一致。

        例如:开发项目“AAA”的根路径为D:\aaa,这样程序运行时当前路径为"D:\aaa",自己可以用System.getProperty("user.dir")方法求证当前用户工作路径。 

        下面代码使用了基于【当前工作路径】的方式指定了文件对象 
File   imageFile   =   new   File("/images/sample.gif"); 
ImageIcon   imageIcon   =   new   ImageIcon(File.toURI); 
File   iniFile   =   new   File("/conf.ini"); 
FileInputStream   fileInputStream   =   new   FileInputStream(iniFile.toURI); 

        这样程序会去找以下两个文件: 

        D:\aaa\images\sample.gif 

        D:\aaa\conf.ini 

        当代码打包后,由于所有图片文件和文本文件都将打包到Jar文件中,使得System中的"user.dir"属性发生了变化,会造成用绝对路径的方式无法找到Jar文件中包含路径和文件。例如大家将上面的项目 “AAA”中的所有类文件、图片文件和文本文件等打包为E:\aaa.jar文件并发布,在用户执行该aaa.jar中的程序时,当前路径取决于用户运行该程序的当前路径。 

例如:   在“E:\”目录下运行该程序: 

E:\> java   -jar   aaa.jar 

此时用户的当前路径(System的user.dir属性)是“E:\”,而非开发者所期望的“E:\aaa”,所以会按以下路径来搜索文件: 
    E:\images\sample.gif 
    E:\conf.ini 
但是所有的图片和文本文件包含在E:\aaa.jar文件中,所以会致使程序无法正常运行。 

        打成Jar包后的文件路径可以通过this.getClass().getClassLoader().getResource("").getPath()查看,发现路径是xxx.jar!/com/demo/..形式

 

        所以需要更换读取文件的方式。推荐采用Java本身【以类为基准】的路径搜索方式。这样代码在运行时,会在jar文件中搜索程序中用到的文件。
例如: 

Reader   reader   =   new   InputStreamReader( getClass().getResourceAsStream("/image/Environment.ini")); 
ImageIcon   i   =   new   ImageIcon(getClass().getResource("/image/b1.gif")); 

以上两行代码采用了下面两条Java语句: 
        getClass().getResourceAsStream("FileName"); 
        getClass().getResource("File"); 
含有这种代码的程序在运行时,以类(类路径)为基准,而不依赖当前路径(System中的user.dir)。 

注意:

        上面的路径"/image/Environment.ini"表示:从classpath的根路径下查找

        如果写成"image/Environment.ini",则表示:在当前类路径下查找(className/image/Environment.ini),这需要保证图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值