`

路径操作工具类-PathUtils

 
阅读更多

 

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.uuzz.frame.base.exception.ProcessPathException;

/**
 * 
 * 类 名: PathUtils 
 * 描 述: 对于路径问题处理的工具类
 * 作 者: Vv
 * 创 建: 2012-11-29
 * 版 本:
 *
 * 历 史: (版本) 作者 时间 注释
 */
public class PathUtil {
	
	public static final String PATH_OLD_SPLIT = "\\\\";
	public static final String PATH_OTHER_SPLIT = "//";
	public static final String PATH_SPLIT = "/";
	public static final String UPPER_PATH = "..";
	public static final String PATH_HTML = "http://";
	
	/**
	 * 
	 * 描 述:追加目录
	 * 作 者:Vv
	 * 历 史: (版本) 作者 时间 注释 
	 * @param parentPath 上级目录	如:D:/AA
	 * @param subPath	子目录	如:BB
	 * @return 以目录名结尾   如: D:/AA/BB
	 */
	public static String appendPath(String parentPath, String subPath){
		
		if (StringUtils.isNotBlank(parentPath) && !parentPath.endsWith(PATH_SPLIT)) {
			parentPath += PATH_SPLIT;
		}
		if (StringUtils.isNotBlank(subPath)) {
			parentPath = parentPath + subPath;
		} 
		
		return processPath(parentPath);
	}
	
	/**
	 * 
	 * 描 述:根据当前路径获取目标路径的相对路径(传入参数为绝对路径)
	 *       算法: 1.将路径分割为文件名的数组
	 *             2.循环当前目录(currentPath)的文件名数组,分别与目标路径(targetPath)的文件数组里的同一位置(索引值i相同)比较
	 *             		2a.如果同一索引值对应的文件夹名相同,则表示存在相对路径,循环继续(continue),直到一索引值对应的文件夹名不相同时,跳出循环
	 *                  2b.如果两个路径的起始部分不一致,则表示不存在相对路径,返回目标路径
	 *             3.根据2中循环结束时的索引值,获取相对路径文件名的集合并组成String
	 * 作 者:Vv
	 * 历 史: (版本) 作者 时间 注释 
	 * @param currentPath	
	 * @param targetPath
	 * @return 存在相对路径,则返回相对路径;否则,返回目标路径
	 * @throws ProcessPathException 
	 */
	public static String getRelativePath(String currentPath, String targetPath) throws ProcessPathException{
		if(StringUtils.isBlank(currentPath) || StringUtils.isBlank(targetPath)){
			throw new ProcessPathException("The currentPath or targetPath parameter is required and can't be null or blank.");
		}
		currentPath = processPath(currentPath);
		targetPath = processPath(targetPath);
		
		String[] cpNames = currentPath.split(PATH_SPLIT);
		String[] tpNames = targetPath.split(PATH_SPLIT);
		
		List<String> rpNames = new ArrayList<String>();
		
		/**
		 * 2.循环当前目录(currentPath)的文件名数组,分别与目标路径(targetPath)的文件数组里的同一位置(索引值i相同)比较
		 * 2a.如果同一索引值对应的文件夹名相同,则表示存在相对路径,循环继续(continue),直到一索引值对应的文件夹名不相同时,跳出循环
		 * 2b.如果两个路径的起始部分不一致,则表示不存在相对路径,返回目标路径
		 */
		int i = 0;
		for(i=0; i < cpNames.length; i++){
			if(cpNames[i].equals(tpNames[i])){
				continue;
			}else if(i == 0){// 如果currentPath与targetPath的起始目录不相同,则说明不存在相对路径
				break;
			}else{
				rpNames.add(UPPER_PATH);
				break;
			}
		}
		
		/**
		 * 3.根据2中循环结束时的索引值 "i",获取相对路径文件名的集合并组成String
		 */
		for(int j=i; j < tpNames.length;j++){
			rpNames.add(tpNames[j]);
		}
		
		String relativePath = "";
		for(String rp:rpNames){
			relativePath = relativePath + rp + PATH_SPLIT;
		}
		
		return processPath(relativePath);
	}
	
	/**
	 * 
	 * 描 述:处理路径问题
	 * 		 如:传入 ///localhost//uuzz/admin/main.action;
	 * 			返回 /localhost/uuzz/admin/main.action
	 * 作 者:Vv
	 * 历 史: (版本) 作者 时间 注释 
	 * @param path
	 * @return
	 */
	public static String processPath(String path){
		path = path.replaceAll(PATH_OLD_SPLIT, PATH_SPLIT);
		if(path.endsWith(PATH_SPLIT)){
			path = path.substring(0, path.length()-1);
		}
		boolean isHttp = false;
		if(path.startsWith(PATH_HTML)){
			isHttp = true;
			path = path.substring(PATH_HTML.length());
		}
		
		// 循环处理,将"//"替换为"/"
		while(path.contains(PATH_OTHER_SPLIT)){
			path = path.replaceAll(PATH_OTHER_SPLIT, PATH_SPLIT);
		}
		
		if(isHttp){
			path = PATH_HTML + path;
		}
		
		return path;
	}
	
	public static void main(String[] args) {
		//String path = "D:/project/.metadata/.plugins/org.eclipse.wst.server.core/";
		//String path =  "D:/project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/conf/Catalina/localhost";
		String path =  "///localhost:8080//uuzz/admin/main.action";
		String tpath = "D:/project/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/logs";
		System.out.println(processPath(path));
		//System.out.println(processPath(tpath));
		try {
			//System.out.println(getRelativePath(tpath,path));
			
			System.out.println(path.substring(PATH_HTML.length()));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    PathUtils 路径拼接工具类

    获取资源在不同系统下路径,拼接资源在不同系统下的路径。

    Android-存放项目中常用的工具类

    - `PathUtils`:帮助处理Android系统的文件路径,如获取外部存储目录、缓存目录等,使得文件操作更加便捷。 7. 导出到Excel: - `ExcelUtils`:允许将数据导出为Excel格式,方便数据的导出和分析,尤其适用于数据...

    web 项目中的各种工具类

    web 项目中的各种工具类 Bean2MapUtil 实体bean的数据转到...PathUtils 获取路径工具 Pinyin4jUtil 提取汉字拼音的工具 StringUtil 字符转换类 UploadQueue 文件上传队列 UUIDGenerator UUID工具 XmlUtils XML读写工具

    28个java常用的工具类

    19. **文件路径处理工具类**:如`PathUtils`,处理文件路径,如`normalize()`规范化路径,`resolveSibling()`获取路径的兄弟路径。 20. **异常处理工具类**:如`ExceptionUtils`,提供异常的捕获、包装和处理,`...

    常见:常用工具类封装

    - `PathUtils`:处理路径相关的操作,如获取绝对路径、检查路径是否存在、生成目录结构等。 4. **网络请求工具类**: - `HttpUtils`:封装了HTTP请求,如GET、POST、PUT等,可以处理超时、重试、JSON解析等。 5....

    Delphi文件及目录的使用 文件操作 目录操作

    在处理文件路径时,可以使用PathUtils单元中的函数,如`ExtractFilePath`用于获取路径中的目录部分,`ExtractFileName`获取文件名,`ChangeFileExt`改变文件扩展名。这些工具函数使得处理复杂的路径字符串变得简单。...

    commons-lang3-3.7

    10. **其他工具类**:除了以上提到的,还有`ClassPathUtils`用于处理类路径,`SystemUtils`提供了操作系统相关的属性查询,`VersionUtils`帮助处理版本号比较等。 在Java Web开发中,`commons-lang3-3.7`通常会被...

    commons-io-2.5-src 源码

    Apache Commons IO 是一个Java库,包含了大量用于处理输入/输出操作的工具类。这个源码包"commons-io-2.5-src"提供了该库的源代码,使得开发者能够深入理解其实现细节,对其进行定制或者扩展。Apache Commons IO库在...

    commons-io-2.6--java框架技术

    - ` FilenameUtils`和`PathUtils`: 提供了与文件名和路径相关的操作,例如获取扩展名、判断路径是否为绝对路径等。 2. **流处理**: - `IOUtils`: 这个类包含了许多静态方法,用于读取、写入、复制、关闭和检测流...

    android java.lang.IllegalArgumentException contains a path separator

    3. 对路径进行校验,使用`PathUtils`等工具类来确保路径的有效性。 4. 当涉及到文件操作时,确保使用的是文件名而不是完整的路径,除非必要。 在开发过程中,使用断言、日志记录和单元测试可以帮助我们尽早发现这些...

    commons-io.jar.rar

    6. **FilenameUtils** 和 **PathUtils**: 分别处理文件名和路径的转换和操作,例如获取文件扩展名,判断是否为绝对路径等。 Commons-io 还提供了对大文件处理的支持,比如分块读写,以及对文件和流的缓冲区管理。...

    org.apache.commons.io.jar

    4. `FilenameUtils`和`PathUtils`:这两个类提供了处理文件名和路径的工具,包括分割、组合、规范化以及比较等操作。 5. `InputStreamReader`和`OutputStreamWriter`:这些类在处理字符流时非常有用,它们可以将...

Global site tag (gtag.js) - Google Analytics