如何正确提取指定目录后的文件子路径以实现批量复制?
正确提取INPUT_DIR之后的子路径方法
推荐方案:使用Java NIO的Path类(最可靠)
直接利用Java专门处理路径的Path类,它的relativize()方法可以精准获取两个路径之间的相对路径,完美解决你的问题:
- 将INPUT_DIR和目标文件路径转换为
Path对象 - 调用
relativize()方法得到相对子路径,自动处理多"html"场景和路径分隔符问题
代码示例:
import java.nio.file.Path; import java.nio.file.Paths; public class SubPathExtractor { public static void main(String[] args) { // 定义输入目录常量 final String INPUT_DIR = "D:\\data\\test\\html"; Path inputDir = Paths.get(INPUT_DIR); // 测试普通路径 Path targetPath1 = Paths.get("D:\\data\\test\\html\\css\\Core.css"); Path subPath1 = inputDir.relativize(targetPath1); System.out.println(subPath1); // 输出: css\Core.css // 测试包含多个"html"的路径 Path targetPath2 = Paths.get("D:\\data\\test\\html\\bla\\bla\\html\\css\\Core.css"); Path subPath2 = inputDir.relativize(targetPath2); System.out.println(subPath2); // 输出: bla\bla\html\css\Core.css } }
备选方案:字符串截取(适合简单场景)
如果不想用NIO类,也可以通过字符串截取实现,核心是基于INPUT_DIR的长度定位,而非分割字符串:
final String INPUT_DIR = "D:\\data\\test\\html"; String filePath = "D:\\data\\test\\html\\css\\Core.css"; // 先验证路径是否以INPUT_DIR开头 if (filePath.startsWith(INPUT_DIR)) { String subpath = filePath.substring(INPUT_DIR.length()); // 移除开头的路径分隔符(兼容Windows和Unix系统) if (subpath.startsWith("\\") || subpath.startsWith("/")) { subpath = subpath.substring(1); } System.out.println(subpath); // 输出: css\Core.css }
为什么原方法不行?
- 用
split("html")会分割所有匹配的"html"字符串,当路径中存在多个"html"时,会错误截断中间内容 - 原方法得到的子路径开头带斜杠,是因为INPUT_DIR的结尾是"html",后面紧跟路径分隔符,split后直接取了分隔符及后面的内容
内容的提问来源于stack exchange,提问作者Sagar Mahalle
相关产品推荐
相关产品推荐

