Java常见的对文件操作的类:
java.io.File:文件系统中的目录和文件
java.util.zip.ZipFile:压缩文件
java.util.jar.JarFile:jar文件
java.util.Properties:以key和value为格式的文件。通常是properties文件
除了以上常用的文件,还是一些特殊的文件,比如vfs文件
现在很多应用服务器发布war包后,都是通过vfs文件来访问war包下的文件,如:vfs:/D:/ test.war/WEB-INF/lib/test.jar/plugins/
最常见的就是加载war包下的配置文件,用File是不能加载的,可以用classLoader.getResourceAsStream来加载。但如果要遍历war包下某个目录。只能通过应用服务器支持的虚拟文件来操作,
如jboss-vfs-3以上: org.jboss.vfs.VirtualFile
Spring的配置文件如果用通配符来加载:classpath*:spring/applicationContext*.xml
早期版本是不支持的,在spring3以后修复了这个问题
PathMatchingResourcePatternResolver源码:
protected Resource[] findPathMatchingResources(StringlocationPattern) throws IOException {
String rootDirPath = determineRootDir(locationPattern);
String subPattern =locationPattern.substring(rootDirPath.length());
Resource[] rootDirResources = getResources(rootDirPath);
Set<Resource> result = new LinkedHashSet<Resource>(16);
for (Resource rootDirResource : rootDirResources) {
rootDirResource = resolveRootDirResource(rootDirResource);
if (isJarResource(rootDirResource)) {
result.addAll(doFindPathMatchingJarResources(rootDirResource,subPattern));
}
elseif (rootDirResource.getURL().getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)){
result.addAll(VfsResourceMatchingDelegate.findMatchingResources(rootDirResource,subPattern, getPathMatcher()));
}
else {
result.addAll(doFindPathMatchingFileResources(rootDirResource,subPattern));
}
}
if (logger.isDebugEnabled()) {
logger.debug("Resolvedlocation pattern [" + locationPattern+ "] to resources " + result);
}
return result.toArray(new Resource[result.size()]);
}
注意:如果你的项目中有一套自己的资源配置类,就需要把vfs考虑进来(除非你的所有资源配置文件都可以通过war包外加载)。