2012-04-26 26 views
14

Mam pełną ścieżkę do pliku i chcę uzyskać nazwę pliku.Podział nazw plików za pomocą separatora plików systemowych

Używam następujące czynności:

String[] splittedFileName = fileName.split(System.getProperty("file.separator")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 

Ale na Windows to daje:

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 
\ 
^ 

mogę uniknąć tego wyjątku? Czy jest lepszy sposób to zrobić?

Odpowiedz

34

Problem polega na tym, że należy użyć numeru \, aby użyć go jako jako ukośnika odwrotnego w wyrażeniu regularnym. Należy albo użyć splitting API which doesn't use regular expressions lub użyj Pattern.quote pierwszy:

// Alternative: use Pattern.quote(File.separator) 
String pattern = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(pattern); 

Albo jeszcze lepiej, użyj File API to:

File file = new File(fileName); 
String simpleFileName = file.getName(); 
3

Podczas wpisywania nazwy pliku, należy użyć System.getProperty("file.separator").

Po odczytaniu nazwy pliku może istnieć ukośnik w przód lub ukośnik w tył jako separator plików.

Możesz też spróbować wykonać następujące czynności:

fileName = fileName.replace("\\", "/"); 
String[] splittedFileName = fileName.split("/")); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
+0

Dzięki @Gilbert Le Blanc, dobry kawałek kodu! proste i działa świetnie! –

0

Przede wszystkim dla tego konkretnego problemu, polecam użyciu klasy java.util.File zamiast regex.

Mimo to źródłem problemu, z którym się spotykasz, jest to, że znak ukośnika odwrotnego '\' oznacza sekwencję specjalną w wyrażeniach regularnych Java. Co się dzieje, to, że parser regex widzi backslash i spodziewa się, że po nim będzie inny znak, który ukończy sekwencję ucieczki. Najłatwiejszym sposobem obejścia tego problemu jest użycie metody java.util.regex.Pattern.quote(), która usunie wszelkie znaki specjalne w ciągu znaków, który ją podajesz.

Dzięki tej zmianie kodu staje:

String splitRegex = Pattern.quote(System.getProperty("file.separator")); 
String[] splittedFileName = fileName.split(splitRegex); 
String simpleFileName = splittedFileName[splittedFileName.length-1]; 
2

Innym prostszym sposobem może być do zrobienia

File f = new File(path); 
String fileName = f.getName(); 

Wierzę, że to będzie działać pod warunkiem, że ścieżki są kompatybilne z platformą, to znaczy nie wiem, czy ścieżka "c: \ plik.txt" będzie działać na Linuksie lub nie.

Powiązane problemy