Jeśli, podobnie jak ja, wolisz użyć kodu biblioteki, w którym prawdopodobnie pomyśleli o wszystkich specjalnych przypadkach, takich jak to, co się stanie, jeśli wpiszesz null lub kropki na ścieżce, ale nie w nazwie pliku, możesz użyć następującego:
możesz także użyć FilenameUtils.getBasename, aby przejść bezpośrednio od ciągu ścieżki do nazwy pliku bez rozszerzenia.
Ian Durkan
2
Najłatwiej jest oczywiście uruchomić maven :-) W przeciwnym razie zobacz: commons.apache.org/io
Ulf Lindback
8
Dla tych, którzy wolą Guava, może to zrobić . (Te dni Osobiście nie czuję się bardzo dobrze o dodanie Apache Commons zależności, choć historycznie te biblioteki są bardzo użyteczne.)
Jonik
3
Chociaż Guava i Commons-IO mogą zaoferować trochę więcej, zdziwiłbyś się, ile metod wygody jest już zawartych w JDK 7 przy pomocy java.nio.file.Filesi Path- takich jak rozwiązywanie katalogów podstawowych, kopiowanie / przenoszenie plików w jednym wierszu, uzyskiwanie tylko nazwy pliku itp.
Don Cheadle
3
@Lan Durkan obecnie Nazwa plikuUtils.getBaseName z dużą literą N
Powolny Harry
153
Najprostszym sposobem jest użycie wyrażenia regularnego.
Regex nie jest tak łatwy w użyciu jak powyższe rozwiązanie biblioteczne. Działa, ale patrzenie na kod (bez konieczności interpretowania REGEXU) nie jest oczywiste, co robi.
Gustavo Litovsky
5
@GustavoLitovsky Android nie jest dostarczany w pakiecie org.apache.commons. O ile mi wiadomo, jest to jedyny sposób, aby to zrobić w Androidzie.
Dodałbym ukośniki do drugiej klasy postaci, aby upewnić się, że nie potknie Cię ścieżka typu „/foo/bar.x/baz”
chrisinmtown
53
Zobacz następujący program testowy:
publicclass javatemp {staticString stripExtension (String str){// Handle null case specially.if(str ==null)returnnull;// Get position of last '.'.int pos = str.lastIndexOf(".");// If there wasn't any '.' just return the string as is.if(pos ==-1)return str;// Otherwise return the string, up to the dot.return str.substring(0, pos);}publicstaticvoid main(String[] args){System.out.println ("test.xml -> "+ stripExtension ("test.xml"));System.out.println ("test.2.xml -> "+ stripExtension ("test.2.xml"));System.out.println ("test -> "+ stripExtension ("test"));System.out.println ("test. -> "+ stripExtension ("test."));}}
które wyjścia:
test.xml -> test
test.2.xml -> test.2
test -> test
test. -> test
Jakie jest rozszerzenie foo.tar.gz? Rozumiem, dlaczego .tar.gzmiałbyś być tym, czego chcesz.
tchrist 30.08.11
5
@tchrist, foo.tar.gzjest wersją spakowaną gzipem, foo.tarwięc możesz również argumentować, że to gzbyło rozszerzenie. Wszystko sprowadza się do sposobu definiowania rozszerzenia.
paxdiablo
2
co zrobić z takimi plikami .gitignore?
Michael Nesterenko
jak wiesz, nazwa klasy w java nigdy nie powinna zaczynać się od małej litery!
AnujKu
7
Gdyby to była reguła, język by ją egzekwował. Ponieważ tak nie jest, jest to wytyczna, jakkolwiek zdecydowanie sugerowana. W każdym razie nie ma to znaczenia dla pytania i odpowiedzi.
paxdiablo
47
Oto skonsolidowana kolejność list według moich preferencji.
Używanie wspólnego apache
import org.apache.commons.io.FilenameUtils;String fileNameWithoutExt =FilenameUtils.getBaseName(fileName);
OR
String fileNameWithOutExt =FilenameUtils.removeExtension(fileName);
String fileName = file.getName();int pos = fileName.lastIndexOf(".");if(pos >0&& pos <(fileName.length()-1)){// If '.' is not the first or last character.
fileName = fileName.substring(0, pos);}
(Zasadniczo taki sam, jak w FilenameUtils.removeExtension()Apache Commons IO, jak sugeruje najwyżej głosowana odpowiedź . Chciałem tylko zaznaczyć, że Guava też to robi. Osobiście nie chciałem dodawać zależności do Commons - co wydaje mi się trochę reliktem - właśnie z tego powodu).
w rzeczywistości jest bardziej jakFilenameUtils.getBaseName()
Angelo.Hannes
w rzeczywistości guawa jest tak niestabilną biblioteką, że po prostu unikam jej używania, gdzie tylko mogę. wolą stabilną reliktę niż eksperymenty googela
/**
* Gets the base name, without extension, of given file name.
* <p/>
* e.g. getBaseName("file.txt") will return "file"
*
* @param fileName
* @return the base name
*/publicstaticString getBaseName(String fileName){int index = fileName.lastIndexOf('.');if(index ==-1){return fileName;}else{return fileName.substring(0, index);}}
Chociaż jestem zwolennikiem ponownego wykorzystywania bibliotek, JAR org.apache.commons.io ma wielkość 174 KB, co jest szczególnie duże jak na aplikację mobilną.
Jeśli pobierzesz kod źródłowy i spojrzysz na jego klasę FilenameUtils, zobaczysz, że istnieje wiele dodatkowych narzędzi i poradzi sobie ze ścieżkami Windows i Unix, co jest cudowne.
Jeśli jednak potrzebujesz kilku statycznych metod narzędziowych do użycia ze ścieżkami w stylu uniksowym (z separatorem „/”), poniższy kod może ci się przydać.
removeExtensionSposób zachowuje resztę toru wraz z pliku. Jest też podobny getExtension.
/**
* Remove the file extension from a filename, that may include a path.
*
* e.g. /path/to/myfile.jpg -> /path/to/myfile
*/publicstaticString removeExtension(String filename){if(filename ==null){returnnull;}int index = indexOfExtension(filename);if(index ==-1){return filename;}else{return filename.substring(0, index);}}/**
* Return the file extension from a filename, including the "."
*
* e.g. /path/to/myfile.jpg -> .jpg
*/publicstaticString getExtension(String filename){if(filename ==null){returnnull;}int index = indexOfExtension(filename);if(index ==-1){return filename;}else{return filename.substring(index);}}privatestaticfinalchar EXTENSION_SEPARATOR ='.';privatestaticfinalchar DIRECTORY_SEPARATOR ='/';publicstaticint indexOfExtension(String filename){if(filename ==null){return-1;}// Check that no directory separator appears after the // EXTENSION_SEPARATORint extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);if(lastDirSeparator > extensionPos){LogIt.w(FileSystemUtil.class,"A directory separator appears after the file extension, assuming there is no file extension");return-1;}return extensionPos;}
Możesz podzielić to przez „.” a na indeksie 0 jest nazwa pliku, a na 1 jest rozszerzenie, ale chciałbym uzyskać najlepsze rozwiązanie z FileNameUtils z apache.commons-io, jak wspomniano w pierwszym artykule. Nie trzeba go usuwać, ale wystarczające jest:
Możesz użyć funkcji java split, aby podzielić nazwę pliku z rozszerzenia, jeśli masz pewność, że w nazwie pliku jest tylko jedna kropka, która jest rozszerzeniem.
File filename = new File('test.txt');
File.getName().split("[.]");
więc split[0]zwróci „test”, a split [1] zwróci „txt”
Wypróbuj poniższy kod. Korzystanie z podstawowych funkcji Java. Dba o Strings z rozszerzeniem i bez rozszerzenia (bez '.'znaku). Przypadek wielokrotności '.'jest również objęty.
String str ="filename.xml";if(!str.contains("."))System.out.println("File Name="+ str);else{
str = str.substring(0, str.lastIndexOf("."));// Because extension is always after the last '.'System.out.println("File Name="+ str);}
Bardzo złą praktyką jest samodzielne wdrażanie tego rodzaju funkcji. Na pierwszy rzut oka zadanie wydaje się niezwykle oczywiste , ale w praktyce napotkasz wiele wyjątkowych sytuacji (np. Nie ma .nazwy pliku lub plik jest kopią zapasową i ma nazwę podobną document.docx.backupitp.). O wiele bardziej niezawodne jest korzystanie z zewnętrznej biblioteki, która zajmuje się wszystkimi tymi wyjątkowymi sytuacjami.
ivstas
1
Z drugiej strony dodanie do wielu bibliotek projektu zwiększy go. Tak proste rzeczy takie jak to można zrobić samemu.
Nicolas Tyler,
1
Nie ma mowy, żebyś sam to zrobił. To trudne: pliki bez rozszerzenia, ale. w ścieżce, ścieżkach ftp, ukośnikach Windows i Unix, symbolicznych linkach itp. Z pewnością zawiedziesz, a próbując zyskać trochę pamięci, reklamujesz dużo niestabilności. Przy minimalnej kopii źródła ustalonego kodu, jeśli pozwalają na to licencje.
Jonathan Nappee
Ten kod wygląda jak ten z Amit Mishra, z wyjątkiem tego zastraszającego „jeśli (! Str. Zawiera („. ”))”
Broken_Window
zakończy się niepowodzeniem w następującym przypadku „/someFolder/some.other.folder/someFileWithoutExtention”. Pierwsza rzecz, która przyszła mi do głowy po 2 sekundach ... jestem pewien, że mógłbym wymyślić mnóstwo innych przykładów.
Odpowiedzi:
Jeśli, podobnie jak ja, wolisz użyć kodu biblioteki, w którym prawdopodobnie pomyśleli o wszystkich specjalnych przypadkach, takich jak to, co się stanie, jeśli wpiszesz null lub kropki na ścieżce, ale nie w nazwie pliku, możesz użyć następującego:
źródło
java.nio.file.Files
iPath
- takich jak rozwiązywanie katalogów podstawowych, kopiowanie / przenoszenie plików w jednym wierszu, uzyskiwanie tylko nazwy pliku itp.Najprostszym sposobem jest użycie wyrażenia regularnego.
Powyższe wyrażenie usunie ostatnią kropkę, po której następuje jeden lub więcej znaków. Oto podstawowy test jednostkowy.
źródło
org.apache.commons
. O ile mi wiadomo, jest to jedyny sposób, aby to zrobić w Androidzie.Zobacz następujący program testowy:
które wyjścia:
źródło
foo.tar.gz
? Rozumiem, dlaczego.tar.gz
miałbyś być tym, czego chcesz.foo.tar.gz
jest wersją spakowaną gzipem,foo.tar
więc możesz również argumentować, że togz
było rozszerzenie. Wszystko sprowadza się do sposobu definiowania rozszerzenia..gitignore
?Oto skonsolidowana kolejność list według moich preferencji.
Używanie wspólnego apache
Korzystanie z Google Guava (jeśli już go używasz)
Lub używając Core Java
1)
2)
3)
Liferay API
źródło
Jeśli twój projekt używa Guava (14.0 lub nowszy), możesz iść z
Files.getNameWithoutExtension()
.(Zasadniczo taki sam, jak w
FilenameUtils.removeExtension()
Apache Commons IO, jak sugeruje najwyżej głosowana odpowiedź . Chciałem tylko zaznaczyć, że Guava też to robi. Osobiście nie chciałem dodawać zależności do Commons - co wydaje mi się trochę reliktem - właśnie z tego powodu).źródło
FilenameUtils.getBaseName()
Poniżej znajduje się odniesienie od https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java
źródło
Jeśli nie chcesz importować pełnego apache.commons, wyodrębniłem tę samą funkcjonalność:
źródło
Chociaż jestem zwolennikiem ponownego wykorzystywania bibliotek, JAR org.apache.commons.io ma wielkość 174 KB, co jest szczególnie duże jak na aplikację mobilną.
Jeśli pobierzesz kod źródłowy i spojrzysz na jego klasę FilenameUtils, zobaczysz, że istnieje wiele dodatkowych narzędzi i poradzi sobie ze ścieżkami Windows i Unix, co jest cudowne.
Jeśli jednak potrzebujesz kilku statycznych metod narzędziowych do użycia ze ścieżkami w stylu uniksowym (z separatorem „/”), poniższy kod może ci się przydać.
removeExtension
Sposób zachowuje resztę toru wraz z pliku. Jest też podobnygetExtension
.źródło
źródło
Najprostszy sposób na uzyskanie nazwy ze ścieżki względnej lub ścieżki pełnej
import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)
źródło
Możesz podzielić to przez „.” a na indeksie 0 jest nazwa pliku, a na 1 jest rozszerzenie, ale chciałbym uzyskać najlepsze rozwiązanie z FileNameUtils z apache.commons-io, jak wspomniano w pierwszym artykule. Nie trzeba go usuwać, ale wystarczające jest:
String fileName = FilenameUtils.getBaseName("test.xml");
źródło
Użyj
FilenameUtils.removeExtension
z Apache Commons IOPrzykład:
Możesz podać pełną nazwę ścieżki lub tylko nazwę pliku .
Mam nadzieję że to pomoże ..
źródło
Płynny sposób:
źródło
Upraszczając, użyj metody String.replaceAll () w języku Java w następujący sposób:
Działa to również wtedy, gdy fileNameWithExt zawiera pełną ścieżkę.
źródło
Możesz użyć funkcji java split, aby podzielić nazwę pliku z rozszerzenia, jeśli masz pewność, że w nazwie pliku jest tylko jedna kropka, która jest rozszerzeniem.
File filename = new File('test.txt'); File.getName().split("[.]");
więc
split[0]
zwróci „test”, a split [1] zwróci „txt”źródło
Wypróbuj poniższy kod. Korzystanie z podstawowych funkcji Java. Dba o
String
s z rozszerzeniem i bez rozszerzenia (bez'.'
znaku). Przypadek wielokrotności'.'
jest również objęty.Możesz dostosować go do pracy z
null
łańcuchami.źródło
.
nazwy pliku lub plik jest kopią zapasową i ma nazwę podobnądocument.docx.backup
itp.). O wiele bardziej niezawodne jest korzystanie z zewnętrznej biblioteki, która zajmuje się wszystkimi tymi wyjątkowymi sytuacjami.