JAVA打包后读取自身JAR中的文件

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

问题分析:
例如:以Windows为例说明,以下是开发项目“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文件中,所以会致使程序无法正常运行。

问题解决:

为了解决上述问题,推荐采用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"如果写成"image/Environment.ini",将表示在类同路径下的路径 (className/image/Environment.ini),这需要您必须将图片和文本等文件的保存路径,和程序中指定的路径两者保持一致。

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test {

public Test (){

  try {
    //  "/Test/123.txt" 相对于包的路径,区分大小写
     InputStream input= this .getClass () .getResourceAsStream ( "
/image/sample.gif " ) ;
     System.out.println ( this .getClass () .getResource ( "/
conf.ini " )) ;
   
     BufferedReader in= new BufferedReader ( new InputStreamReader ( input )) ;
     String a;
     while ( true ){
      a=in.readLine () ;
    
      if ( a== null )

               break ;
    
      System.out.println ( a+ "-----" ) ;
     }
     in.close () ;
    } catch ( IOException e ) {
     e.printStackTrace () ;
    }
  
}

public static void main ( String [] args ){
    new Test () ;
   }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值