`
ycljf86
  • 浏览: 77452 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

jar 资源文件

    博客分类:
  • java
阅读更多
今天在做加密器的时候。遇到了读取文件的问题。在jar包的同目录放上一个文件。那么我们在jar文件的class文件中 只要 openFile("文件名") 就可以了。
这里用了个bat文件来启动jar文件。 start javaw -jar  xx.jar

如何读取资源文件:
(一)
Properties props = new Properties();  
props.load(new FileInputStream("db.properties"));
(二)
blog.properties文件如下
dbdriver=oracle.jdbc.driver.OracleDriver
dburl=jdbc:oracle:thin:@127.0.0.1:1521:ora92
dbuser=blog
dbpwd=blog
--------------
public class Config {
public Config() {
    this.initDBConfig();
}
public String DBdriver;
public String DBuser;
public String DBpwd;
public String DBurl;
private void initDBConfig() {
    try {
      ResourceBundle bundle = ResourceBundle.getBundle("blog");
      DBdriver = bundle.getString("dbdriver");
      DBurl = bundle.getString("dburl");
      DBuser = bundle.getString("dbuser");
      DBpwd = bundle.getString("dbpwd");
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
}
}
----------------
public class DAO {
public DAO() {
}
public Connection getConnection() {
    Connection conn = null;
    Config config = new Config();
    String DBdriver = config.DBdriver;
    String DBuser = config.DBuser;
    String DBpwd = config.DBpwd;
    String DBurl = config.DBurl;
    try {
      Class.forName(DBdriver);
      conn = DriverManager.getConnection(DBurl, DBuser, DBpwd);
    }
    catch (Exception ex) {
      System.out.println("********************");
      System.out.println("不能得到数据库连接");
      System.out.println("DBdriver: " + DBdriver);
      System.out.println("DBuser: " + DBuser);
      System.out.println("DBpwd: " + DBpwd);
      System.out.println("DBurl: " + DBurl);
      ex.printStackTrace();
    }
    return conn;
}
}
(三)
Properties props=new Properties();
props.load(BugFactory. class.getResourceAsStream("xx.properties"));
String name = props.getPropery("xxxx");
此时xx.properties应该与该类放在同一个目录.
(四)
ResourceBundle res = ResourceBundle.getBundle("yy.properties");
String name = res.getString("yyyy");
yy.properties应放在/WEB-INF/classes目录
(五)
如果你这个Bean打包的话,就把这个文件放在包内。
我一般是这样写的
Properties prop = new Properties();
try
{
InputStream is = getClass().getResourceAsStream("db.properties");
prop.load(is);
if(is!=null)
    is.close();
}
另:
props.load(new FileInputStream("db.properties")); 是读取当前目录的db.properties文件
getClass.getResourceAsStream("db.properties"); 是读取当前类所在位置一起的db.properties文件
getClass.getResourceAsStream("/db.properties"); 是读取ClassPath的根的db.properties文件,注意ClassPath如果是多个路径或者jar文件的,只要在任意一个路径目录下或者 jar文件里的根下都可以,如果存在于多个路径下的话,按照ClassPath中的先后顺序,使用先找到的,其余忽略.


在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:

Java代码
//源代码1:  
package edu.hxraid;  
import java.io.*;  
public class Resource {  
    public  void getResource() throws IOException{  
        File file=new File("bin/resource/res.txt");  
        BufferedReader br=new BufferedReader(new FileReader(file));  
        String s="";  
        while((s=br.readLine())!=null)  
            System.out.println(s);  
    }  
}    

//源代码1:
package edu.hxraid;
import java.io.*;
public class Resource {
public  void getResource() throws IOException{
File file=new File("bin/resource/res.txt");
BufferedReader br=new BufferedReader(new FileReader(file));
String s="";
while((s=br.readLine())!=null)
System.out.println(s);
}
}         这段代码写在Eclipse建立的java Project中,其目录为:(其中将资源文件res.txt放在了bin目录下,以便打成jar包)
      1、src/
              src/edu/hxraid/Resource.java
      2、bin/
              bin/resource/res.txt
              bin/edu/hxraid/Resource.class

      很显然运行源代码1是能够找到资源文件res.txt。但当我们把整个工程打成jar包以后(ResourceJar.jar),这个jar包内的目录为:
              edu/hxraid/Resource.class
              resource/res.txt



         而这时jar包中Resource.class字节码:ldc <String "bin/resource/res.txt"> [20] 将无法定位到jar包中的res.txt位置上。就算把bin/目录去掉:ldc <String "resource/res.txt"> [20] 仍然无法定位到jar包中res.txt上。

      这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource /res.txt"这种形式的文件URL来定位res.txt。所以即使是相对路径,也无法定位到jar文件内的txt文件(读者也许对这段原因解释有些费解,在下面我们会用一段代码运行的结果来进一步阐述)。



          那么把资源打入jar包,无论ResourceJar.jar在系统的什么路径下,jar包中的字节码程序都可以找到该包中的资源。这会是幻想吗?




      当然不是,我们可以用类装载器(ClassLoader)来做到这一点:

         (1) ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用ResourceJar.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息(包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:
          ● public URL getResource(String name)
            查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。
          ● public InputStream getResourceAsStream(String name);
             返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

         

          (2) ClassLoader是abstract的,不可能实例化对象,更加不可能通过ClassLoader调用上面两个方法。所以我们真正写代码的时候,是通过Class类中的getResource()和getResourceAsStream()方法,这两个方法会委托ClassLoader中的getResource()和getResourceAsStream()方法 。好了,现在我们重新写一段Resource代码,来看看上面那段费解的话是什么意思了:

Java代码
//源代码2:  
package edu.hxraid;  
import java.io.*;  
import java.net.URL;  
public class Resource {  
    public  void getResource() throws IOException{    
              //查找指定资源的URL,其中res.txt仍然开始的bin目录下   
        URL fileURL=this.getClass().getResource("/resource/res.txt");   
        System.out.println(fileURL.getFile());  
    }  
    public static void main(String[] args) throws IOException {  
        Resource res=new Resource();  
        res.getResource();  
    }  


//源代码2:
package edu.hxraid;
import java.io.*;
import java.net.URL;
public class Resource {
public  void getResource() throws IOException{
              //查找指定资源的URL,其中res.txt仍然开始的bin目录下
URL fileURL=this.getClass().getResource("/resource/res.txt");
System.out.println(fileURL.getFile());
}
public static void main(String[] args) throws IOException {
Resource res=new Resource();
res.getResource();
}
}        运行这段源代码结果:/E:/Code_Factory/WANWAN/bin/resource/res.txt  (../ Code_Factory/WANWAN/.. 是java project所在的路径)

           我们将这段代码打包成ResourceJar.jar ,并将ResourceJar.jar放在其他路径下(比如 c:\ResourceJar.jar)。然后另外创建一个java project并导入ResourceJar.jar,写一段调用jar包中Resource类的测试代码:

Java代码
import java.io.IOException;  
import edu.hxraid.Resource;  
public class TEST {  
    public static void main(String[] args) throws IOException {  
        Resource res=new Resource();  
        res.getResource();  
    }  


import java.io.IOException;
import edu.hxraid.Resource;
public class TEST {
public static void main(String[] args) throws IOException {
Resource res=new Resource();
res.getResource();
}
}           这时的运行结果是:file:/C:/ResourceJar.jar!/resource/res.txt



           我们成功的在运行时动态获得了res.txt的位置。然而,问题来了,你是否可以通过下面这样的代码来得到res.txt文件?
                      File f=new File("C:/ResourceJar.jar!/resource/res.txt");
            当然不可能,因为".../ResourceJar.jar!/resource/...."并不是文件资源定位符的格式 (jar中资源有其专门的URL形式: jar:<url>!/{entry} )。所以,如果jar包中的类源代码用File f=new File(相对路径);的形式,是不可能定位到文件资源的。这也是为什么源代码1打包成jar文件后,调用jar包时会报出FileNotFoundException的症结所在了。



          (3) 我们不能用常规操作文件的方法来读取ResourceJar.jar中的资源文件res.txt,但可以通过Class类的getResourceAsStream()方法来获取 ,这种方法是如何读取jar中的资源文件的,这一点对于我们来说是透明的。我们将Resource.java改写成:

Java代码
//源代码3:  
package edu.hxraid;  
import java.io.*;  
public class Resource {  
    public void getResource() throws IOException{  
        //返回读取指定资源的输入流  
        InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");   
        BufferedReader br=new BufferedReader(new InputStreamReader(is));  
        String s="";  
        while((s=br.readLine())!=null)  
            System.out.println(s);  
    }  


//源代码3:
package edu.hxraid;
import java.io.*;
public class Resource {
public void getResource() throws IOException{
//返回读取指定资源的输入流
InputStream is=this.getClass().getResourceAsStream("/resource/res.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String s="";
while((s=br.readLine())!=null)
System.out.println(s);
}
}           我们将java工程下/bin目录中的edu/hxraid/Resource.class和资源文件resource/res.txt一并打包进ResourceJar.jar中,不管jar包在系统的任何目录下,调用jar包中的Resource类都可以获得jar包中的res.txt资源,再也不会找不到res.txt文件了。
分享到:
评论

相关推荐

    AXMLPrinter2.jar 资源文件xml破解

    AXMLPrinter2.jar 资源文件xml破解Android反编译清单文件乱码解析

    dom4j.jar 资源文件

    dom4j.jar 资源文件 dom4j.jar 资源文件 dom4j.jar 资源文件 dom4j.jar 资源文件

    sprintboot maven 打包分离lib jar 资源文件 properties xml yml

    sprintboot maven 打包分离lib jar 资源文件 properties xml yml 详细信息查看我的博客 https://mp.csdn.net/postedit/80274087 java -jar -cp 启动

    jar资源文件

    这个jar爬虫搜索,简单的搜索引擎,java爬虫,搜索引擎例子,爬虫demo,java实现互联网内容抓取,搜索引擎大揭密.java爬虫程序。web搜索。爬虫程序。sigar搜索,定时搜索互联网内容信息。包很好用,

    Android工程做成jar包和资源文件

    开发android框架的时候需要对资源文件的处理 还有框架打jar包的时候的注意事项

    JAR文件包及jar命令详解

    Java Archive (JAR) 文件是Java程序中常用的打包格式,它允许将多个类文件、资源文件和其他相关文件组合成一个单一的归档文件。JAR文件不仅方便了代码的分发和存储,还支持压缩,减少了文件占用的空间。此外,JAR...

    JAR文件读取工具

    Java Archive (JAR) 文件是Java平台上的一个重要组成部分,它主要用于打包Java类、资源文件以及元数据。JAR文件的出现使得Java开发者能够将多个类文件组合成一个单一的可执行文件,方便分发和执行。在Java开发过程中...

    jar文件如何打开或者jar文件关联到java

    JAR文件本质上是ZIP文件的一种扩展,用于打包Java类文件、资源文件和其他元数据。了解如何打开以及如何将JAR文件与Java环境进行关联对于开发者来说至关重要。 #### 一、打开JAR文件的方法 1. **使用命令行** 在...

    jar包文件查看工具

    Java Jar(Java Archive)文件是Java平台上的一个重要组成部分,它用于封装Java类库,包括.class文件、资源文件和其他元数据。Jar文件的创建旨在提高应用程序的分发效率,通过将多个文件打包成一个单一的可执行文件...

    http通信下载资源文件jar

    JAR文件是Java平台特有的打包格式,它可以包含类文件、资源文件、元数据以及manifest文件。manifest文件记录了关于JAR的基本信息,如主类和版本号。 1. 创建JAR:使用Java的jar命令或者构建工具如Maven、Gradle可以...

    修改jar包中的class文件

    JAR(Java ARchive)文件是Java平台上的一个标准归档格式,它包含了一个或多个类文件以及其他资源文件。这些文件被组织成与Java包(package)相匹配的目录结构。当我们运行一个JAR文件时,Java虚拟机(JVM)会加载...

    Jar文件转Text文件

    Java Archive(JAR)文件是Java平台上的一个特殊格式,用于打包相关的类文件、资源文件以及元数据。这种格式在Java开发中广泛使用,因为它们允许开发者将多个文件打包成一个单一的可分发单元,便于部署和管理。然而...

    Jar包中如何正确地加载资源文件博文中用到的测试项目源码

    在Java开发中,将资源文件打包到JAR(Java Archive)包中是常见的做法,这样可以方便地分发和执行程序。然而,加载这些资源文件可能会遇到一些问题,特别是当资源文件位于类路径(classpath)的深层目录结构中时。本...

    删除jar包中的指定文件

    在Java中,JAR(Java Archive)文件是一种归档格式,用于将多个类文件和其他资源组合到一个单一的文件中,方便分发和执行。然而,一旦JAR文件被创建,通常情况下是无法直接修改其内部内容的,因为它们是以只读方式...

    详解Java读取Jar中资源文件及示例代码

    Java读取Jar中资源文件的实现与应用 Java读取Jar中资源文件是一种常见的操作,在开发Java项目时,经常需要读取jar包中的资源文件。下面将详细介绍Java读取Jar中资源文件的实现代码和应用。 一、Java读取Jar中资源...

    jar 资源包

    Java Archive (JAR) 文件是Java平台上的一个特殊文件格式,用于封装多个类文件、资源文件和其他相关数据。它在Java开发中起着至关重要的作用,尤其在构建可执行的Java应用程序和库时。以下是对JAR文件及其相关知识点...

    android studio 生成Jar包并调用资源文件

    使用android studio生成jar包,并且使用映射来完美调用资源文件。包含两个工程,一个如何生成jar包,一个是如何使用jar包,调用资源文件。使用详情可以关注我的blog,http://blog.csdn.net/jujishou521

Global site tag (gtag.js) - Google Analytics