如何独立分割路径平台?
我正在使用以下代码来获取包含给定路径中所有子目录的数组。
String[] subDirs = path.split(File.separator);
我需要数组来检查某些文件夹是否在此路径中的正确位置。 这看起来是一个很好的解决方案,直到findBugs抱怨File.separator用作正则表达式。 似乎将Windows文件分隔符传递给正在构建正则表达式的函数是一个坏主意,因为反斜杠是一个转义字符。
如何在不使用File.separator的情况下以跨平台方式拆分路径? 或者这样的代码好吗?
String[] subDirs = path.split("/");
重复使用path.getParentFile()
获取路径的所有组件。
path.replaceAll("\\", "/").split("/")
方式是path.replaceAll("\\", "/").split("/")
。 path.replaceAll("\\", "/").split("/")
。
文字化模式字符串
每当您需要将任意String
文字化以用作正则表达式模式时,请使用Pattern.quote
:
来自API:
public static String quote(String s)
返回指定
String
的文字模式String
。 此方法生成一个String
,该String
可用于创建与字符串s
匹配的Pattern
,就好像它是文字模式一样。 输入序列中的元字符或转义序列将没有特殊含义。参数:
s
– 要文字化的字符串
返回:文字字符串替换
这意味着您可以执行以下操作:
String[] subDirs = path.split(Pattern.quote(File.separator));
字面化替换字符串
如果需要对任意替换String
进行字面化,请使用Matcher.quoteReplacement
。
来自API:
public static String quoteReplacement(String s)
返回指定
String
的文字替换String
。 此方法生成一个String
,它将作为Matcher
类的appendReplacement
方法中的文字替换。 生成的String
将匹配s
作为文字序列处理的字符序列。 斜杠('\'
)和美元符号('$'
)将没有特殊含义。参数:
s
– 要文字化的字符串
返回:文字字符串替换
这个引用的替换String
在String.replaceFirst
和String.replaceAll
也很有用:
请注意,替换字符串中的反斜杠(
\
)和美元符号($
)可能会导致结果与将其视为文字替换字符串时的结果不同。 如果需要,使用Matcher.quoteReplacement
来抑制这些字符的特殊含义。
例子
System.out.println( "OMG".replaceAll(".", "!") ); // prints "!!!!!!" System.out.println( "OMG".replaceAll(Pattern.quote("."), "!") ); // prints "O!M!G!" System.out.println( "Microsoft software".replaceAll("so", "$0") ); // prints "Microsoft software" System.out.println( "Microsoft software".replaceAll("so", Matcher.quoteReplacement("$0")) ); // prints "Micro$0ft $0ftware"
java.nio.file.Path实现了Iterable
,所以你可以这样做:
public static void showElements(Path p) { List 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)); }
方法getNameCount和getName可用于类似目的。
您可以使用Path接口:
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; }
创建一个空列表并使用forEach迭代路径元素,将每个元素插入列表中供以后使用:
List pathElements = new ArrayList<>(); Paths.get("/foo/bar/blah/baz").forEach(p -> pathElements.add(p.toString()))
此外,如果您需要特定的路径元素,请使用:
.getName().toString()
其中
是通过调用Paths.get()
返回的,如果需要在字符串中返回路径的多个部分,请使用:
.subPath(, ).toString()
您可以使用以下命令获取路径元素的总数(在
):
.getNameCount()
Java Path和Paths文档页面还有其他有用的方法。
关于什么
String[] subDirs = path.split(File.separator.replaceAll("\\", "\\\\"));