package org.springside.modules.utils.io;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.springside.modules.utils.collection.ListUtil;
import org.springside.modules.utils.reflect.ClassUtil;
import org.springside.modules.utils.text.Charsets;
import com.google.common.io.Resources;
/**
* 针对Jar包内的文件的工具类.
*
* 1.ClassLoader
*
* 不指定contextClas时,优先使用Thread.getContextClassLoader(), 如果未设置则使用Guava Resources的ClassLoader
*
* 指定contextClass,则直接使用该contextClass的ClassLoader.
*
* 2.路径
*
* 不指定contextClass时,按URLClassLoader的实现, 从jar file中查找resourceName,
*
* 所以resourceName无需以"/"打头即表示jar file中的根目录,带了"/" 反而导致JarFile.getEntry(resouceName)时没有返回.
*
* 指定contextClass时,class.getResource()会先对name进行处理再交给classLoader,打头的"/"的会被去除,不以"/"打头则表示与该contextClass package的相对路径,
* 会先转为绝对路径.
*
* 3.同名资源
*
* 如果有多个同名资源,除非调用getResources()获取全部资源,否则在URLClassLoader中按ClassPath顺序打开第一个命中的Jar文件.
*/
public class ResourceUtil {
// 打开单个文件////
/**
* 读取规则见本类注释.
*/
public static URL asUrl(String resourceName) {
return Resources.getResource(resourceName);
}
/**
* 读取规则见本类注释.
*/
public static URL asUrl(Class<?> contextClass, String resourceName) throws IOException {
return Resources.getResource(contextClass, resourceName);
}
/**
* 读取规则见本类注释.
*/
public static InputStream asStream(String resourceName) throws IOException {
return Resources.getResource(resourceName).openStream();
}
/**
* 读取文件的每一行,读取规则见本类注释.
*/
public static InputStream asStream(Class<?> contextClass, String resourceName) throws IOException {
return Resources.getResource(contextClass, resourceName).openStream();
}
////// 读取单个文件内容/////
/**
* 读取文件的每一行,读取规则见本类注释.
*/
public static String toString(String resourceName) throws IOException {
return Resources.toString(Resources.getResource(resourceName), Charsets.UTF_8);
}
/**
* 读取文件的每一行,读取规则见本类注释.
*/
public static String toString(Class<?> contextClass, String resourceName) throws IOException {
return Resources.toString(Resources.getResource(contextClass, resourceName), Charsets.UTF_8);
}
/**
* 读取文件的每一行,读取规则见本类注释.
*/
public static List<String> toLines(String resourceName) throws IOException {
return Resources.readLines(Resources.getResource(resourceName), Charsets.UTF_8);
}
/**
* 读取文件的每一行,读取规则见本类注释.
*/
public static List<String> toLines(Class<?> contextClass, String resourceName) throws IOException {
return Resources.readLines(Resources.getResource(contextClass, resourceName), Charsets.UTF_8);
}
///////////// 打开所有同名文件///////
public static List<URL> getResources(String resourceName) {
return getResources(resourceName, ClassUtil.getDefaultClassLoader());
}
public static List<URL> getResources(String resourceName, ClassLoader contextClassLoader) {
try {
Enumeration<URL> urls = contextClassLoader.getResources(resourceName);
List<URL> list = new ArrayList<URL>(10);
while (urls.hasMoreElements()) {
list.add(urls.nextElement());
}
return list;
} catch (IOException e) {
return ListUtil.emptyList();
}
}
}