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打包后怎么读取里面的文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)