org.springframework.core.io.ClassPathResource类
测试代码
package cn.edu.hdu.pichen.springexample; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.List; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.util.StringUtils; import cn.edu.hdu.pichen.springexample.beans.User; /** * Hello world! * */ public class App { public static void main(String[] args) throws IOException { // ClassPathResource resource = new // ClassPathResource("./../classes/beans.xml"); // System.out.println(resource.getPath()); // System.out.println(resource.getDescription()); // System.out.println(resource.getURL().getPath()); // // InputStream is = resource.getInputStream(); // BufferedReader br = new BufferedReader(new InputStreamReader(is)); // String str = br.readLine(); // while (str != null) // { // System.out.println(str); // str = br.readLine(); // } // System.out.println(StringUtils.cleanPath(".\\beans.xml")); // \\替换为/ System.out.println(StringUtils.cleanPath("file:core/../core/./io/Resource.class")); // System.out.println(StringUtils.cleanPath("./../../beans.xml")); // System.out.println(StringUtils.cleanPath("./tmp/tmp2/../beans.xml")); // // // BeanFactory factory = new XmlBeanFactory(resource); // User user = factory.getBean("user", User.class); // System.out.println("Name:" + user.getName() + "\nAge:" + // user.getAge()); } }
pom
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.edu.hdu.pichen</groupId> <artifactId>springexample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springexample</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.7.RELEASE</version> </dependency> </dependencies> </project>
涉及的相关类源码
org.springframework.util.StringUtils工具类的collectionToDelimitedString方法
/** * Convenience method to return a Collection as a delimited (e.g. CSV) * String. E.g. useful for <code>toString()</code> implementations. * @param coll the Collection to display * @param delim the delimiter to use (probably a ",") * @param prefix the String to start each element with * @param suffix the String to end each element with * @return the delimited String */ public static String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix) { if (CollectionUtils.isEmpty(coll)) { return ""; } StringBuilder sb = new StringBuilder();//局部变量,不需要同步,使用StringBuilder即可 Iterator<?> it = coll.iterator(); while (it.hasNext()) { sb.append(prefix).append(it.next()).append(suffix); if (it.hasNext()) { sb.append(delim); } } return sb.toString(); }
该方法代码很简单,不需要多说明,就是简单的字符串拼接,依次遍历入参coll集合,并取出元素进行前缀、后缀、分隔符拼接。
入参及返回值说明
* @param 需要处理的元素集合(如果是对象,拼接的是toString方法的字符串)
* @param 分隔符(如分号;)
* @param 拼接的元素前缀
* @param 拼接的元素后缀
* @return 处理完后的结果
举个例子:
List<String> pathElements = new LinkedList<String>(); pathElements.add("AAA"); pathElements.add("BBB"); pathElements.add("CCC"); System.out.println(StringUtils.collectionToDelimitedString(pathElements, ";", "#", "$"));
结果打印(分隔符";",前缀"#", 后缀"$"):
#AAA$;#BBB$;#CCC$
org.springframework.util.StringUtils工具类的cleanPath方法
/** * Normalize the path by suppressing sequences like "path/.." and * inner simple dots. * <p>The result is convenient for path comparison. For other uses, * notice that Windows separators ("\") are replaced by simple slashes. * @param path the original path * @return the normalized path */ public static String cleanPath(String path) { if (path == null) { return null; } String pathToUse = replace(path, WINDOWS_FOLDER_SEPARATOR, FOLDER_SEPARATOR); // Strip prefix from path to analyze, to not treat it as part of the // first path element. This is necessary to correctly parse paths like // "file:core/../core/io/Resource.class", where the ".." should just // strip the first "core" directory while keeping the "file:" prefix. int prefixIndex = pathToUse.indexOf(":"); String prefix = ""; if (prefixIndex != -1) { prefix = pathToUse.substring(0, prefixIndex + 1); pathToUse = pathToUse.substring(prefixIndex + 1); } if (pathToUse.startsWith(FOLDER_SEPARATOR)) { prefix = prefix + FOLDER_SEPARATOR; pathToUse = pathToUse.substring(1); } String[] pathArray = delimitedListToStringArray(pathToUse, FOLDER_SEPARATOR); List<String> pathElements = new LinkedList<String>(); int tops = 0; for (int i = pathArray.length - 1; i >= 0; i--) { String element = pathArray[i]; if (CURRENT_PATH.equals(element)) { // Points to current directory - drop it. } else if (TOP_PATH.equals(element)) { // Registering top path found. tops++; } else { if (tops > 0) { // Merging path element with element corresponding to top path. tops--; } else { // Normal path element found. pathElements.add(0, element); } } } // Remaining top paths need to be retained. for (int i = 0; i < tops; i++) { pathElements.add(0, TOP_PATH); } return prefix + collectionToDelimitedString(pathElements, FOLDER_SEPARATOR); }
该方法根据输入的原始路径转换成一个规格化的路径,如下示例:
.\\beans.xml -----》beans.xml
file:core/../core/./io/Resource.class -----》file:core/io/Resource.class
代码也不复杂简单说明下吧: