Разделить путь к каталогу другим путем - PullRequest
3 голосов
/ 23 октября 2019

Я читаю путь к каталогу, используя системные свойства в Java, которые будут работать как в Windows, так и в системах на основе Linux. Теперь мне нужно разделить этот путь только с частью пути, чтобы получить остальные. например, C:\Test1\Test2\Test3\Test4

Мне нужно разделить вышеуказанный путь с помощью C:\Test1\Test2 и получить Test3\Test4. Когда я получаю это как строку и использую функцию split, которая выдаст мне ошибку как недопустимый символ из-за символа "\". Если я планирую экранировать этот символ с помощью "\\", это может не сработать в Linux. Есть ли способ, которым я могу заставить это работать как в Linux, так и в Windows?

Ответы [ 4 ]

2 голосов
/ 23 октября 2019

Шаблон, переданный в 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);

Обратите внимание, что это также обрабатывает rootправильные пути, т. е. в 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 голосов
/ 23 октября 2019

Используйте следующий подход.

 //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 голосов
/ 23 октября 2019

Вы ищете File.separator. Используйте его, чтобы разделить строку.

Из документов ,

Системно-зависимый символ-разделитель имен по умолчанию, представленный для удобства в виде строки.

1 голос
/ 23 октября 2019

Вы можете использовать разделитель при создании пути к файлу.

Использовать java.io.File.separator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...