Java 如何拆分独立于平台的路径?
我使用以下代码从给定路径获取包含所有子目录的数组Java 如何拆分独立于平台的路径?,java,regex,file,cross-platform,Java,Regex,File,Cross Platform,我使用以下代码从给定路径获取包含所有子目录的数组 String[] subDirs = path.split(File.separator); 我需要数组来检查某些文件夹是否位于此路径中的正确位置。 这看起来是一个很好的解决方案,直到findBugs抱怨File.separator被用作正则表达式。似乎将windows文件分隔符传递给正在使用它构建正则表达式的函数是个坏主意,因为反斜杠是转义字符 如何在不使用File.separator的情况下跨平台分割路径? 或者像这样的代码可以吗 Str
String[] subDirs = path.split(File.separator);
我需要数组来检查某些文件夹是否位于此路径中的正确位置。
这看起来是一个很好的解决方案,直到findBugs抱怨File.separator被用作正则表达式。似乎将windows文件分隔符传递给正在使用它构建正则表达式的函数是个坏主意,因为反斜杠是转义字符
如何在不使用File.separator的情况下跨平台分割路径?
或者像这样的代码可以吗
String[] subDirs = path.split("/");
反复使用
path.getParentFile()
获取路径的所有组件
不推荐的方法是使用path.replaceAll(“\\”,“/”).split(“/”)
怎么办
String[] subDirs = path.split(File.separator.replaceAll("\\", "\\\\"));
文字化模式字符串
当您需要将任意字符串
文字化以用作正则表达式模式时,请使用:
从API:
公共静态字符串引号(字符串s)
为指定的String
返回文本模式String
。此方法生成一个字符串
,可用于创建一个模式
,该模式将匹配字符串s
,就像它是一个文字模式一样。
输入序列中的元字符或转义序列没有特殊意义
参数:s
-要进行文字化的字符串返回:文本字符串替换 这意味着您可以执行以下操作:
String[] subDirs = path.split(Pattern.quote(File.separator));
文字化替换字符串 如果需要对任意替换的字符串进行文字化,请使用 从API:
公共静态字符串引号替换(字符串s)
返回指定的字符串
的文本替换字符串
。此方法生成一个字符串
,该字符串将在Matcher
类的appendReplacement
方法中用作文本替换s
。生成的字符串
将匹配s
中作为文字序列处理的字符序列。斜杠(“\”
)和美元符号(“$”
)没有特殊含义
参数:s
-要进行文字化的字符串返回:文本字符串替换 此引用的替换
String
在String.replaceFirst
和String.replaceAll
中也很有用:
请注意,替换字符串中的反斜杠(\
)和美元符号($
)可能会导致结果不同于将其视为文字替换字符串时的结果。如果需要,可以使用Matcher.quoteReplacement
抑制这些字符的特殊含义
例子 实现
Iterable
,因此您可以执行以下操作:
public static void showElements(Path p) {
List<String> nameElements = new ArrayList<>();
for (Path nameElement: p)
nameElements.add(nameElement.toFile().getName());
System.out.printf("For this file: [%s], the following elements were found: [%s]\n"
, p.toAbsolutePath()
, Joiner.on(", ").join(nameElements));
}
公共静态void showElements(路径p){
List namelements=new ArrayList();
对于(路径名元素:p)
添加(namelement.toFile().getName());
System.out.printf(“对于此文件:[%s],找到了以下元素:[%s]\n”
,p.toAbsolutePath()
,Joiner.on(“,”).join(namelements));
}
方法和可用于类似目的。您可以使用路径接口:
Path p = Paths.get(pathStr);
for (int i = 0; i < p.getNameCount(); i++) {
String name = p.getName(i).toString();
//do what you need with name;
}
Path p=Path.get(pathStr);
对于(int i=0;i
创建一个空列表,并使用forEach迭代路径元素,将每个元素插入列表中供以后使用:
List<String> pathElements = new ArrayList<>();
Paths.get("/foo/bar/blah/baz").forEach(p -> pathElements.add(p.toString()))
您可以通过以下方法获取路径元素的总数(用于
):
.getNameCount()
Java和doc页面还有其他有用的方法。+1有一些黑客方法和编写方法。这是正确的方法,与使用“/”、“\”分裂相比,这将为您节省很多痛苦,是的,我采用了令人沮丧的方式。抱歉。请添加解释,说明您的代码为什么工作以及它如何解决问题。如果它提供了解决方案,请提供解释,否则答案将被删除。问题是跨平台的,您的代码仅适用于windows。
List<String> pathElements = new ArrayList<>();
Paths.get("/foo/bar/blah/baz").forEach(p -> pathElements.add(p.toString()))
<pathObject>.getName(<intIndex>).toString()
<pathObject>.subPath(<intStart>, <intEnd>).toString()
<pathObject>.getNameCount()