永发信息网

jar包内读取资源文件

答案:3  悬赏:80  手机版
解决时间 2021-02-24 10:05
  • 提问者网友:那叫心脏的地方装的都是你
  • 2021-02-23 22:29
我把一个.class文件和一个txt文件打成了一个jar包, 我要在.class文件中读取txt文件, 路径始终不对.
最佳答案
  • 五星知识达人网友:胯下狙击手
  • 2021-02-23 23:36
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);
}
}
这段代码写在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 [20] 将无法定位到jar包中的res.txt位置上。就算把bin/目录去掉:ldc [20] 仍然无法定位到jar包中res.txt上。
这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource /res.txt"这种形式的文件URL来定位res.txt。所以即使是相对路径,也无法定位到jar文件内的txt文件(读者也许对这段原因解释有些费解,在下面我们会用一段代码运行的结果来进一步阐述)。
全部回答
  • 1楼网友:迷人又混蛋
  • 2021-02-24 02:16
//源代码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文件了。
  • 2楼网友:一袍清酒付
  • 2021-02-24 00:42
直接把你的外部jar加载到systemclassloader试试看 可以通过反射的方式实现 for example urlclassloader loader = (urlclassloader) classloader.getsystemclassloader(); method method = urlclassloader.class.getdeclaredmethod("addurl", new class[] { url.class }); //反射获取方法 method.setaccessible(true); file jar = new file(yourjarpath); //外部jar路径 url url = jar.touri().tourl(); method.invoke(loader, new object[]{url}); //加载jar到systemclassloader
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯