如何从JAR文件中读取文件

如何从JAR文件中读取文件,第1张

package eduhxraid;

import javaio;

public class Resource {

public void getResource() throws IOException{

//返回读取指定资源的输入流

InputStream is=thisgetClass()getResourceAsStream("/resource/restxt");

BufferedReader br=new BufferedReader(new InputStreamReader(is));

String s="";

while((s=brreadLine())!=null)

Systemoutprintln(s);

}

}

我们将java工程下/bin目录中的edu/hxraid/Resourceclass和资源文件resource/restxt一并打包进ResourceJarjar中,不管jar包在系统的任何目录下,调用jar包中的Resource类都可以获得jar包中的restxt资源,再也不会找不到restxt文件了

绝大多数Java程序员非常善于利用JAR文件的优势将各种包含Java解决方案的资源进行打包。面对JAR文件,人们询问的一个普遍问题是:“我何从一个JAR文件中

提取出一个图象文件?”。

用RAR打开包获取文件

你用导包不行吗

你用IMPORT命令把你包里所要用的CLASS文件能拿不出来吗

Java 2 SDK 标准版提供了一个 jar 工具,你可以通过它在控制台下读写 JAR 文件。然后,也许有些时候你想在你的程序中读写 JAR 文件。(这篇技巧仅涉及了在程序中读 JAR 文件的内容。)非常高兴,你可以做到,并且不需要考虑解压的问题,因为类库已经帮你处理了。你要用到的类都在 javautiljar 包中。这里要用到的主要的类是 JarFile 类,它是一个 jar 文件自身的引用。其中的每个文件则由 JarEntry 引用。

参考资料自己看一下,太多了我就不复制到这里了

使用如下方式读取JAR中的文件出错

类路径下放了一个jarfilejar,如下所示:

如上所示,com/yyy/1txt放在jarfilejar中。

我原来使用如下的方式读取这个JAR中的文件:

Java代码

@Test

public void usingSpringMethod() throws Throwable {

PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();

Resource[] resources = patternResolvergetResources("com/yyy/1txt");

if (resources != null && resourceslength > 0) {

File file = resources[0]getFile();//<---①

FileInputStream inputStream = new FileInputStream(file);

InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

char[] data = new char[100];

inputStreamReaderread(data);

assertEquals((new String(data))trim(), "ddddd");

}

}

运行后,抛出异常,其问题出在①处,原因是:JAR中的文件无法以File方式返回,而只有在文件系统中的类资源才可以以File的形式返回。

但是,不管是文件系统中的类资源,还是JAR中的类资源文件,都可以以流的形式读取,因此,如上的代码调整一下就正常了:

Java代码

@Test

public void usingSpringMethod() throws Throwable {

PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();

Resource[] resources = patternResolvergetResources("com/yyy/1txt");//<--②

if (resources != null && resourceslength > 0) {

InputStreamReader inputStreamReader = new InputStreamReader(resources[0]getInputStream());//<---①

char[] data = new char[100];

inputStreamReaderread(data);

assertEquals((new String(data))trim(), "ddddd");

}

}

上面①处,使用resource[0]getInputStream()代替原来的

引用

resources[0]getFile()

。当然,②处的资源路径表达式,可以使用Spring的其它方式表示:

方式1:

Java代码

Resource[] resources = patternResolvergetResources("classpath:com/yyy/1txt");

方式2:

Java代码

Resource[] resources = patternResolvergetResources("classpath:com/yyy/1txt");

直接原生的JDK方式读取

Spring对资源路径的表达方式非常灵活,这是我们首选使用Spring加载资源的原因。当然,使用JDK原生的ClassLoader也可以加载JAR中的资源文件,如下所示:

Java代码

@Test

public void usingJDKMethod() throws Throwable {

URL url = getClass()getClassLoader()getResource("com/yyy/1txt");//<--①

InputStreamReader inputStreamReader = new InputStreamReader(urlopenStream());

char[] data = new char[100];

inputStreamReaderread(data);

assertEquals((new String(data))trim(), "ddddd");

}

唯一的限制是,在①处不再支持classpath:或classpath:的前缀了。

MANIFESTMF文件位于jar包下的META-INF/包路径 目录下。

public final class ManifestUtils {

private static final String MANIFEST_DIRECTORY_LOCATION = "META-INF" + Fileseparator + "MANIFESTMF";

private static final String MANIFEST_ENTRY = "META-INF/MANIFESTMF";

/

Creates a {@link Reader} for the manifest in the supplied exploded JAR directory

@param directory the exploded JAR directory

@return the <code>Reader</code> or <code>null</code> if the manifest cannot be found

/

public static final Reader manifestReaderFromExplodedDirectory(File directory) {

if (directory == null || !directoryisDirectory()) {

throw new IllegalArgumentException("Must supply a valid directory");

}

try {

File manifestFile = new File(directorygetAbsolutePath() + Fileseparator + MANIFEST_DIRECTORY_LOCATION);

if (manifestFileexists()) {

return new FileReader(manifestFile);

} else {

return null;

}

} catch (IOException e) {

throw new RuntimeException("Unable to read MANIFEST for exploded directory '" + directorygetAbsolutePath() + "'", e);

}

}

/

Creates a {@link Reader} for the manifest in the supplied JAR file

@param file the JAR file

@return the <code>Reader</code> or <code>null</code> if the manifest cannot be found

/

public static final Reader manifestReaderFromJar(File file) {

JarFile jar = null;

try {

jar = new JarFile(file);

JarEntry entry = jargetJarEntry(MANIFEST_ENTRY);

if (entry != null) {

StringWriter writer = new StringWriter();

FileCopyUtilscopy(new InputStreamReader(jargetInputStream(entry)), writer);

jarclose();

return new StringReader(writertoString());

} else {

return null;

}

} catch (Exception e) {

throw new RuntimeException("Cannot read MANIFESTMF from jar '" + filegetAbsolutePath() + "'", e);

} finally {

if (jar != null) {

try {

jarclose();

} catch (IOException ioe) {

throw new RuntimeException("Failed to close jar '" + filegetAbsolutePath() + "'", ioe);

}

}

}

}

}

jar内的一个文件又不是一个 *** 作系统的文件,无法得到一个File对象(除非你把jar给解压到一个临时文件夹里)。可以用ClassLoadergetSystemResourceAsStream()得到一个InputStream对象。

以上就是关于如何从JAR文件中读取文件全部的内容,包括:如何从JAR文件中读取文件、请教,怎样从jar包里提取指定的一些文件、jar打包后怎么读取里面的文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9852715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存