`

读取Jar包内的资源

阅读更多

在项目中使用Maven,有大量的jar包。
原来代码中 直接使用 Xxx.class.getResourceAsStream()方法来获取资源。
问题出现了,一旦classpath下或其它先加载jar包中出现相同的配置文件,那么就会优先读取这些文件

 

下面这个工具类可以帮助我们处理jar包内的资源

 

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Enumeration;

import com.zskx.pem.network.biz.commons.helper.file.FileReader;
import com.zskx.web.commons.action.BaseAction;

/**
 * Jar包相关工具
 * 
 * @author <a href="mailto:gaollg@sina.com">gaollg@sina.com</a>
 *
 */
public class JarUtils {

	/**
	 * 取得class所在 jar包名称
	 * 
	 * @param clazz 
	 * @return 返回值为null 表示直接在classpath下
	 */
	public static String getJarName(Class<?> jarClazz){
		String file = jarClazz.getProtectionDomain().getCodeSource().getLocation().getFile();
		if(file.endsWith(File.separator)){
			//就在classpath下
			return null;
		}
		return new File(file).getName();
	}
	
	/**
	 * 取得class所在 jar包 中的资源
	 * 
	 * @param jarClazz 
	 * @param resource 所取的资源
	 * @return
	 */
	public static URL getResourceFromJar(Class<?> jarClazz, String resource){
		if(resource.startsWith(File.separator)){
			resource = resource.substring(1);
		}
		
		URL classDir = jarClazz.getProtectionDomain().getCodeSource().getLocation();
		if(classDir.getPath().endsWith(File.separator)){
			//就在classpath下
			return jarClazz.getResource(resource);
		}
		//jar文件
		String path = classDir.toString();
		
        try {
			Enumeration<URL> res = jarClazz.getClassLoader().getResources(resource);
			while (res.hasMoreElements()) {
				URL url = res.nextElement();
				if(url.getPath().startsWith(path)){
					return url;
				}
			}
		} catch (IOException e) {
			//IO异常直接返回 null
			return null;
		}
		return null;
	}
	
	/**
	 * 取得class所在 jar包 中的资源
	 * 
	 * @param jarClazz 
	 * @param resource 所取的资源
	 * @return
	 */
    public static InputStream getResourceAsStreamFromJar(Class<?> jarClazz, String resource){
		URL url = getResourceFromJar(jarClazz, resource);
		try {
		    return url != null ? url.openStream() : null;
		} catch (IOException e) {
		    return null;
		}
    }
    
	/**
	 * 取得文件的所有文本内容 
	 * @param file
	 * @return
	 */
	public static String readAllText(InputStream in){
		StringBuffer sb = new StringBuffer();
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		try {
			String tempString = null;
			while ((tempString = br.readLine()) != null) {
				sb.append(tempString).append("\r\n");
            }
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally{
			if(in!=null){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return sb.toString();
	}
	
	public static String readInputStream(Charset charset, InputStream in) {
		byte[] bytes = new byte[1024];
		int length = -1;
		ByteArrayOutputStream byteOutput= new ByteArrayOutputStream();
		try {
			while ((length = in.read(bytes)) != -1) {
				byteOutput.write(bytes, 0, length);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return new String(byteOutput.toByteArray(), charset);
	}
	
	public static String readResourceFromJar(Charset charset, Class<?> jarClazz, String resource) {
		InputStream in = getResourceAsStreamFromJar(jarClazz, resource);
		return readInputStream(charset, in);
	}
	
	public static String readResourceFromJar(Class<?> jarClazz, String resource) {
		return readResourceFromJar(Charset.forName("utf-8"), jarClazz, resource);
	}
	
	public static void main(String[] args) {
		//测试类 BaseAction在jar包中
		System.out.println(readResourceFromJar(BaseAction.class, "image.properties"));
		
	}
	
}

 

分享到:
评论

相关推荐

    读取war包或jar包内的文件

    标题"读取war包或jar包内的文件"涉及到的知识点主要是如何在程序中动态地获取并读取这些归档文件中的内容,这对于理解和处理Java应用的部署和运行至关重要。这篇博客(虽然链接未提供具体内容)可能探讨了以下关键点...

    spring读取jar中的配置文件

    总结起来,Spring提供了多种方式读取JAR内配置文件,包括`@PropertySource`、`@ConfigurationProperties`以及直接使用`Resource`接口。理解这些方法的使用和它们之间的差异对于开发和维护复杂的Spring应用至关重要。...

    Java源文件读取JAR包文件.rar

    始终验证用户提供的输入,确保它指向预期的JAR内资源。 6. **优化性能**:如果你需要频繁地读取JAR中的文件,考虑使用`URLClassLoader`或`Class.getResourceAsStream()`方法,这可能会提供更好的性能。 通过以上...

    Android的Jar包从主项目工程中读取并展示资源文件

    作为Android程序开发,我们自己在实际项目的开发过程中,经常会遇到我们打的Jar包需要动态的读取主项目工程中的资源文件,那么有没有一种好的方式,能够让Jar包非常方便的读取与展示主工程中的资源文件呢?...

    java 读取jar包文件

    在Java编程中,读取jar包内的文件是一个常见的需求,特别是在运行时动态加载资源或类文件时。Java提供了一种内置的方式,通过`java.util.jar`包中的`JarFile`和`JarInputStream`类来实现这个功能。下面将详细介绍...

    JAR文件读取工具

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

    读取jar包中的图片,文本, 文本会写到控制台,图片会输出到F:盘中

    以下是读取JAR内资源的基本步骤: 1. **打开JAR文件**: - 使用`JarFile`类的构造函数,传入`ClassLoader`的`getResources()`方法返回的`URL`,该URL表示JAR文件的路径。`ClassLoader`通常是我们当前类的`getClass...

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

    在Java项目中,经常需要使用jar包来存储和加载资源文件,如配置文件、图片、音频等。读取Jar中资源文件可以实现资源的动态加载和更新,不需要手动将资源文件复制到classpath下。 二、Java读取Jar中资源文件的实现 ...

    java读取excel文件jar包20181223

    这个名为"java读取excel文件jar包20181223"的资源可能包含了一些帮助Java开发者实现这一功能的库。下面将详细讨论Java与Excel交互的相关知识点。 1. **Apache POI**: Apache POI 是一个开源项目,提供了处理...

    jar包、class文件读取工具

    2. jar包读取:在Java中,可以使用`java.util.jar`包中的`JarFile`类来读取jar包。通过指定jar路径,可以打开jar文件并遍历其中的条目,获取类文件或其他资源。此外,`URLClassLoader`可以加载jar包中的类,使得运行...

    jar 包 内文件读取 文件内容

    以下是对"jar包内文件读取 文件内容"这一主题的详细说明。 1. **访问JAR文件内容**: - 使用`java.util.jar.JarFile`类:这是Java标准库提供的一种方式,可以打开并访问JAR文件的内容。你需要创建一个`JarFile`...

    lib中的jar lib中的jar包

    使用lib中的jar包** - **构建路径**:在IDE如Eclipse、IntelliJ IDEA中,可以将`lib`目录设置为项目的类路径,使得其中的`jar`包被自动引入。 - **命令行执行**:使用`java -cp`或`-classpath`参数指定`jar`包的...

    Java实现从jar包中读取指定文件的方法

    在给定的代码示例中,`JarFileAccess`类展示了如何读取JAR文件中的指定文件并将其复制到目标目录。 1. **创建`JarFile`对象**: 使用`new JarFile()`构造函数创建`JarFile`对象,传入JAR文件的路径。这将打开JAR...

    读取jar文件

    - 在jar包内部,资源文件的路径通常是以`/`开头的相对路径表示。例如,如果资源文件位于`bin/resource/res.txt`,那么它在代码中应当表示为`"/resource/res.txt"`。 3. **读取资源的常见方式**: - 使用当前类的...

    解决SpringBoot jar包中的文件读取问题实现

    为了解决这个问题,我们需要利用Java的类加载器(ClassLoader)来访问jar包内的资源。通过`Class`对象的`getResourceAsStream()`方法,我们可以获取到一个输入流,从而读取jar内的资源,如下所示: ```java public ...

    SpringBoot如何读取war包jar包和Resource资源

    SpringBoot读取war包jar包和Resource资源 SpringBoot 中读取 war 包 jar 包和 Resource 资源是开发过程中的常见问题。下面是相关知识点的总结: 1. ClassLoader 获取资源文件 在 SpringBoot 项目中,使用 ...

    Eclipse打包成JAR包读取外部JAR包和外部配置文件(源码)

    下面我们将详细探讨如何在Eclipse中打包JAR包,并读取外部JAR包和外部配置文件。 首先,我们需要了解JAR文件的结构。JAR文件是Java类文件和相关资源的容器,它们被组织成目录结构,类似于Unix或Windows的文件系统。...

    jar包里读取图片.rar ,,自己写的例子

    当我们把图片放入JAR包时,它们会被当作普通文件存储在特定的路径下。在运行时,我们不能像在文件系统中那样直接打开JAR内的文件,而需要通过Java的内置机制来访问。 1. **使用Class.getResource()或Class....

    jar包解析工具

    可以使用Java内置的`JarFile`类来实现这一功能,也可以借助第三方工具,例如`jdgui_0.3.6`,它是一个可视化的反编译工具,能够帮助开发者查看`jar`包内的类文件源代码。 3. **加载**:在Java程序中,`ClassLoader`...

    MANIFEST.MF的应用以及如何读取jar包外的log4j.properties

    描述中提到的“如何读取jar包外的log4j.properties”,这是Java日志框架Log4j的一个常见需求。Log4j是一个强大的日志处理库,它允许开发者通过配置文件(如log4j.properties或log4j.xml)来定制日志记录级别、输出...

Global site tag (gtag.js) - Google Analytics