怎样从JAR文件中读取文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样从JAR文件中读取文件?相关的知识,希望对你有一定的参考价值。

怎样从JAR文件中读取文件?
我指的是怎样将JAR文件里的文件复制出来.

进入jar文件其实没有说的那么困难,jar文件本质是一个zip格式的压缩文件,只是把文件后缀名改了,要用Java读取里面的文件也没有那么想象的那么困难。使用相关协议就可以:
例如:c盘根目录有一个test.jar文件文件里面有个a.txt文件我们就读取这个a.txt文件
文件对应的URL:
jar:file:/C:/test.jar!/a.txt

Java代码:

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class TestDouble
public static void main(String[] args) throws IOException
URL url=new URL("jar:file:/C:/test.jar!/a.txt");
System.out.println(url);
InputStream is=url.openStream();
byte b[]=new byte[1000];
is.read(b);
System.out.println(new String(b).trim());



不是很清楚你到底是从直接将jar中文件解压出来还是通过Java将jar文件中的文件复制出来,如果是想直接解压出文件用winrar就可以了,要用Java复制看下面这个测试,基本上和复制文件差不多:

import java.io.*;
import java.net.URL;

public class CopyFile
public static void copyFormJar(String fileUrl, String dest )
throws IOException

int BUFF_SIZE = 100000;
byte[] buffer = new byte[BUFF_SIZE];
InputStream in = null;
OutputStream out = null;
URL url=new URL(fileUrl);
try

in = url.openStream();
out = new FileOutputStream( dest );
while ( true )

synchronized ( buffer )

int amountRead = in.read( buffer );
if ( amountRead == -1 )

break;

out.write( buffer, 0, amountRead );



finally

if ( in != null )

in.close();

if ( out != null )

out.close();



public static void main(String[] args) throws IOException
args=new String[2];
args[0]="jar:file:/C:/test.jar!/a.txt";
args[1]="c:/test.txt";
CopyFile.copyFormJar(args[0], args[1]);



参考技术A 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文件了
参考技术B 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文件了
参考技术C jar可以用电脑上的winrar打开,不过里面的文件格式很特殊,没有专门软件是打不开的。

从 .jar 文件夹中读取文件

【中文标题】从 .jar 文件夹中读取文件【英文标题】:Read a file from inside the .jar folder 【发布时间】:2011-10-11 22:44:09 【问题描述】:

我需要通过这种方式读取jar文件夹内的文件:

 DataSource coverdata = new FileDataSource(new File("here is the path"));

我如何获得确切的路径?我正在使用一个库,所以我可以访问文件的唯一方法是new File(),没有输入流。

【问题讨论】:

嗯,好像是这个的复制品:***.com/questions/6639/… @Arthur Shniv "DataSource" 你能帮我解释一下吗?那是javax.activation.DataSourcejavax.sql.DataSource,还是别的什么? “我正在使用一个库,所以我可以访问文件的唯一方法是 new File(),没有输入流。” 听起来你需要让他们修复他们的 API。要么那个,要么使用不同的。 【参考方案1】:

如何使用@home 已经讨论过的 InputStream (getResourceAsStream() ) 方法创建一个新的临时文件,然后将其作为普通文件读取?

【讨论】:

【参考方案2】:

你走错路了。文件只是直接写入文件系统的东西。从 java API 的角度来看,jar 中的文件不是文件。

要读取此文件,您必须使用 JarInputStream 或 ZipInputStream 解析 JAR,获取有趣的条目并从输入流中读取。这并不难,但您必须编写几行代码。

其他方法是使用来自 jakarta.org 的 VFS 包。它为您提供不同文件系统、ZIP、TAR 和其他容器格式的元素的统一视图。

【讨论】:

【参考方案3】:

致电ClassLoader.getResourceAsStream()::InputStreamClassLoader.getResource()::URL

见:

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResourceAsStream(java.lang.String)

包含所请求文件的 JAR 文件必须在类路径中。

【讨论】:

以上是关于怎样从JAR文件中读取文件?的主要内容,如果未能解决你的问题,请参考以下文章

怎么用java读取pdf文件内容

自定义jar配置文件问题?

怎么从外部读取jar包中的资源文件

从 jar 中读取外部配置文件

如何从 jar 文件中读取文件?

从 .jar 文件夹中读取文件