Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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_Java 8 - Fatal编程技术网

Java 用另一个路径拆分目录路径

Java 用另一个路径拆分目录路径,java,java-8,Java,Java 8,我使用java中的系统属性读取目录路径,这在windows和基于Linux的系统中都适用。现在,我只需要将此路径与路径的一部分分割,以检索其余部分。例如,C:\Test1\Test2\Test3\Test4 我需要用C:\Test1\Test2分割上述路径,并检索Test3\Test4。 当我将其作为字符串获取,并使用split函数时,由于“\”字符,该函数将给我错误作为非法字符。如果我计划用“\\”转义这个字符,这在Linux框中可能不起作用。有没有一种方法可以在Linux和Windows中实

我使用java中的系统属性读取目录路径,这在windows和基于Linux的系统中都适用。现在,我只需要将此路径与路径的一部分分割,以检索其余部分。例如,
C:\Test1\Test2\Test3\Test4

我需要用
C:\Test1\Test2
分割上述路径,并检索
Test3\Test4

当我将其作为字符串获取,并使用
split
函数时,由于
“\”
字符,该函数将给我错误作为非法字符。如果我计划用
“\\”
转义这个字符,这在Linux框中可能不起作用。有没有一种方法可以在Linux和Windows中实现此功能?

您正在查找
文件.separator
。用它来分割你的字符串

依赖于系统的默认名称分隔符,为方便起见,以字符串表示


使用以下方法

 //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]

希望这能解决问题。

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


使用java.io.File.separator

传递给
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);

请尝试
java.io.File.separator
。您考虑过使用接口吗?我已经更新了答案,请检查。您可以添加一个检查分隔符,并基于您可以使用拆分的分隔符。您从我的答案中借用了
File.separator
。不管怎么说,实施的痛苦是+1:)@Sohail,这将返回一个数组或拆分。相反,我想要的是一个完整的字符串,如Test3/Test4。可能类似于主路径被拆分为C:/Test1/Test2,我将知道这一点。最后的输出可能类似于[“C:/Test1/Test2”,“Test3/Test4”]@RaghavendraBankapur,如果您知道第一部分,那么您可以使用类似的东西<代码>字符串s=“C:\\Test1\\Test2\\Test3\\Test4”;字符串[]输出=新字符串[2];输出[0]=s.substring(0,s.indexOf(“Test2”));输出[1]=s.substring(s.indexOf(“Test2”)+6,s.length());System.out.println(Arrays.toString(output))@Sohail这更像是索引。如果这些值是静态的,那么它可以正常工作。但当这些值是动态的时,这可能会失败。我可以通过
String[]details=f.getAbsolutePath().length()-(f.getAbsolutePath().length()-System.getProperty(“path”).length()实现它上面将给我数组中的2个项目。这在Linux和windows中都有效。这将为我提供路径的第二部分,但分为单独的部分。最终我想要的只有两个部分。你读了全部答案了吗,特别是最后一部分<代码>第一个
第二个
正好是两个部分,如果这个操作不符合您的意图,您应该编辑您的问题来描述您真正想要的内容。我确实阅读了您的完整答案。如果我知道我能深入了解家长,你的解决方案就会奏效。如果这是作为用户输入到我的程序,那么它将很难。保持此选项的动态性我评论说,如果我的输入是动态的且未知,则此选项可能不起作用。无论如何,谢谢你的回答。这就是为什么我说,你应该编辑你的问题来描述,你到底想要什么。您收到了几个答案,告诉您如何在每个分隔符处拆分。你一直说你不想那样。您说过,您想分成两部分,根据您的示例输入,这两部分将在一定深度上分开。如果这不是标准,则应指定实际标准。另一方面,如果已知
first
部分,就像您的一条注释中暗示的那样,只需忽略
.getParent().getParent()
操作,并关注
second=first.relatiize(path)
解决方案即可获得第二个。