Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何拆分独立于平台的路径?_Java_Regex_File_Cross Platform - Fatal编程技术网

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()