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

3

我使用Java中的系统属性读取目录路径,这将适用于Windows和Linux系统。现在我需要分割此路径,并仅使用路径的一部分来检索其余部分。例如,C:\Test1\Test2\Test3\Test4

我需要使用C:\Test1\Test2拆分上述路径,并检索Test3\Test4。 当我将其作为字符串获取并使用split函数时,由于"\"字符而出现错误。如果我打算使用"\\"转义该字符,则在Linux系统中可能无法正常工作。有没有办法让这在Linux和Windows两个系统中都能正常工作?


2
尝试使用 java.io.File.separator - caisil
2
你考虑过使用接口 Path 吗? - Abra
4个回答

2
你需要使用File.separator来分割你的字符串。根据文档,它是系统依赖的默认名称分隔符,为了方便起见表示为字符串。

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]

希望这能解决问题。


我已经更新了答案,请检查。你可以添加一个检查分隔符并根据分隔符使用split函数。 - Sohail Ashraf
你从我的回答中借用了 File.separator。不管怎样,对于实现的痛苦加一分! :) - Mohamed Anees A
@Sohail,这将返回一个数组或拆分。我想要的是整个字符串作为Test3/Test4。可能像主路径与C:/Test1/Test2一起拆分,我会知道。最终输出可能是["C:/Test1/Test2","Test3/Test4"]。 - Raghavendra Bankapur
@RaghavendraBankapur,如果您知道第一部分,那么您可以使用类似以下的代码:String s = "C:\\Test1\\Test2\\Test3\\Test4"; String[] output = new String[2]; output[0] = s.substring(0, s.indexOf("Test2")); output[1] = s.substring(s.indexOf("Test2") + 6, s.length()); System.out.println(Arrays.toString(output)); - Sohail Ashraf
@Sohail 这更像是索引。如果值是静态的,那么它可以正常工作。但是当值是动态的时,这可能会失败。 我可以通过以下方式实现: (f.getAbsolutePath().length()-System.getProperty("path").length()));``` 上述代码将在数组中给我2个项目。这在Linux和Windows中都有效。 - Raghavendra Bankapur

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上,根目录是/,而不是空字符串,在仅在分隔符字符处拆分时,两种情况都无法正确处理。
即使在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);

这将为我提供路径的第二部分,但是拆分为单独的部分。最终我想要的只有2个部分。 - Raghavendra Bankapur
2
你读完整个答案了吗,特别是最后一部分?firstsecond确切地说是两个部分,如果这个操作不符合你的意图,你应该编辑你的问题来描述你真正想要的。 - Holger
我已经阅读了你的完整答案。如果我知道父级可以深入多少层,你的解决方案将有效。如果这是作为用户输入进入我的程序,那么它将会很困难。为了保持这个选项的动态性,我评论说如果我的输入是动态的而不是已知的,它可能无法工作。无论如何,感谢你的答案。 - Raghavendra Bankapur
1
这就是为什么我说,你应该编辑你的问题来描述你真正想要的。你收到了几个回答,告诉你如何在每个分隔符处拆分。你一直说你不想要那个。你说,你想把它分成两部分,根据你的示例输入,会在某个深度上进行拆分。如果这不是标准,你应该指定实际标准。另一方面,如果“第一个”部分已知,就像你的评论中暗示的那样,只需忽略“.getParent().getParent()”操作,专注于“second = first.relativize(path)”解决方案来获取第二个部分。 - Holger

1

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

使用java.io.File.separator


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接