2013-03-14 5 views
4

У меня есть путь к файлу, как это:Извлечение части путей в Java

/home/Dara/Desktop/foo/bar/baz/qux/file.txt 

В Java, я хотел бы быть в состоянии получить два верхних папки. То есть. baz/qux независимо от длины пути к файлу или операционной системы (разделители пути файла, такие как /: и \). Я попытался использовать метод subpath() в Paths, но я не могу найти общий способ получить длину пути к файлу.

+0

Что не работает с использованием 'Path.subpath()'? –

+0

Использование 'Path.subpath (0, 2)' дает мне 'home/Dara'. Я хотел бы сказать что-то вроде 'Path.subpath (myPath.length() - 3, myPath.length() - 1', чтобы получить' baz/qux'. –

+2

Нельзя использовать 'Path.getNameCount () 'для длины? –

ответ

7

Пока не очень, однако, угадать направление:

File parent = file.getParentFile(); 
File parent2 = parent.getParentFile(); 
parent2.getName() + System.getProperty("path.separator") + parent.getName() 

Другой вариант:

final int len = path.getNameCount(); 
path.subpath(len - 3, len - 1) 

Edit: Вы должны либо проверить Len или поймать IllegalArgumentException, чтобы сделать код более надежным.

+0

Прекрасно! Я соглашусь, когда смогу :) –

2

Вы могли бы просто split Строкой или использовать StringTokenizer.

+0

Правда, я делаю это сейчас, но мне было бы более удобно использовать более общий способ. –

+0

Что вы имеете в виду более общим способом? –

+0

Согласно DR Ответ: –

1

File.getParent() удалит имя файла.

И разделитель пути вы получите: System.getProperty("file.separator").

Затем вы можете использовать String.split(), чтобы получить каждую часть пути.

4

Методы getNameCount() и getName(int index) из java.nio.Path должен помочь вам:

File f = new File("/home/Dara/Desktop/foo/bar/baz/qux/file.txt"); 
Path p = f.toPath(); 
int pathElements = p.getNameCount(); 
String topOne = p.getName(pathElements-2).toString(); 
String topTwo = p.getName(pathElements-3).toString(); 

Пожалуйста, обратите внимание, что результат getNameCount() должны быть проверены на достоверность, прежде чем использовать его в качестве индекса для getName().

2

Использование subpath и getNameCount.

Path myPath = Paths.get("/home/Dara/Desktop/foo/bar/baz/qux/file.txt"); 
    Path subPath = myPath.subpath(myPath.getNameCount() -3, myPath.getNameCount() -1); 
Смежные вопросы