用另一个路径分割目录路径

时间:2019-10-23 03:23:42

标签: java java-8

我使用java中的系统属性读取目录路径,该属性在Windows和基于Linux的系统中都可以使用。现在,我需要仅使用一部分路径来拆分此路径以检索其余部分。例如C:\Test1\Test2\Test3\Test4

我需要用C:\Test1\Test2分割上面的路径并检索Test3\Test4。 当我将其作为字符串获取并使用split函数时,由于存在"\"字符,将由于错误字符而给我带来错误。如果我打算使用"\\"来转义此字符,则在Linux框中可能无法使用。有什么方法可以使它在Linux和Windows上都能正常工作?

4 个答案:

答案 0 :(得分:2)

您正在寻找File.separator。用它来分割字符串。

docs

  

取决于系统的默认名称分隔符,为方便起见,用字符串表示。

答案 1 :(得分:2)

使用以下方法。

 //Windows
   String s = "C:\\Test1\\Test2\\Test3\\Test4";
   String[] output = s.split(("/".equals(File.separator))? File.separator : "\\\\" );
   //output: [C:, Test1, Test2, Test3, Test4]

 //Linux:
   String linuxString = "/Test1/Test2/Test3/Test4";
   String[] linuxOutput = linuxString.split(("/".equals(File.separator))? File.separator : "\\\\" );
   //output: [, Test1, Test2, Test3, Test4]

希望这可以解决问题。

答案 2 :(得分:2)

传递给String.split的模式具有正则表达式语法,因此java.util.regex包是寻找用于处理它们的其他工具的地方,例如引用字符串以强制进行文字匹配。

因此,仅使用系统属性和字符串操作的解决方案如下

String path=System.getProperty("your.property"), sep=System.getProperty("file.separator");
for(String s: path.split(Pattern.quote(sep)))
    System.out.println(s);

但是,没有理由不使用专用的API:

Path path = Paths.get(System.getProperty("your.property"));
if(path.isAbsolute()) System.out.println(path.getRoot());
for(Path p: path)
    System.out.println(p);

请注意,这也可以正确处理根路径,即在Windows上,驱动器的根目录类似于C:\,而不是C:;在Linux上,根目录是/,而不是一个空字符串,并且仅在分隔符char处分割时,两种情况都无法正确处理。

甚至在Java 7之前,就有一个API可以处理此问题:

File path = new File(System.getProperty("your.property"));
for(File f = path; f != null; f = f.getParentFile())
    System.out.println(f.getName().isEmpty()? f.getPath(): f.getName());

尽管代码将以相反的顺序迭代元素。


请注意,使用专用API,在路径上方两级拆分的特定任务变得多么简单:

Path path = Paths.get(System.getProperty("your.property"));
Path first = path.getParent().getParent(), second = first.relativize(path);

System.out.println("first: "+first);
System.out.println("second: "+second);

答案 3 :(得分:1)

构建文件路径时可以使用分隔符。

使用java.io.File.separator