我使用java中的系统属性读取目录路径,该属性在Windows和基于Linux的系统中都可以使用。现在,我需要仅使用一部分路径来拆分此路径以检索其余部分。例如C:\Test1\Test2\Test3\Test4
我需要用C:\Test1\Test2
分割上面的路径并检索Test3\Test4
。
当我将其作为字符串获取并使用split
函数时,由于存在"\"
字符,将由于错误字符而给我带来错误。如果我打算使用"\\"
来转义此字符,则在Linux框中可能无法使用。有什么方法可以使它在Linux和Windows上都能正常工作?
答案 0 :(得分:2)
答案 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