W przypadku 95% projektów powinna to być akceptowana odpowiedź. Przepisanie kodu w ten sposób jest główną przyczyną wielu bólów głowy!
Carsten Hoffmann
1
Po prostu dodaj następującą linię w gradle, aby dodać zależność: - kompiluj 'commons-io: commons-io: 2.6'
Deepak Sharma
przykład proszę.
john ktejik
8
Jeśli masz już Apache Commons I / O w swoim projekcie, to prawda. Ale jeśli to wszystko, czego potrzebujesz, dodajesz (co najmniej) 2,5 MB masy własnej do swojego projektu, aby coś, co można łatwo zrobić za pomocą jednej linii.
if (str! = null && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils to kolejna zależność, która nie zawsze jest dostępna
ocramot
88
Ponieważ używanie String.substringi String.lastIndexw jednowierszowym jest dobre, istnieją pewne problemy związane z możliwością radzenia sobie z określonymi ścieżkami plików.
Weźmy na przykład następującą ścieżkę:
a.b/c
Użycie jednowierszowego spowoduje:
a
To jest niepoprawne.
Wynik powinien być c, ale ponieważ plik nie miał rozszerzenia, ale ścieżka miała katalog z .w nazwie, metoda jednowierszowa została oszukana i podała część ścieżki jako nazwę pliku, co nie jest poprawne.
Aby odtworzyć jego zachowanie, napisałem kilka testów, jakie powinna spełniać nowa metoda, a są to:
Nazwa pliku ścieżki
-------------- --------
a / b / cc
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg
ab / cc
ab / c.jpg c
ab / c.jpg.jpg c.jpg
cc
c.jpg c
c.jpg.jpg c.jpg
(I to wszystko, co sprawdziłem - prawdopodobnie są inne kontrole, które powinny być na miejscu, o których przeoczyłem).
Uruchomienie tej removeExtensionmetody z powyższymi testami daje wyniki wymienione powyżej.
Metoda została przetestowana z następującym kodem. Ponieważ zostało to uruchomione w systemie Windows, separatorem ścieżki jest znak, \który musi zostać poprzedzony znakiem a, \gdy jest używany jako część Stringliterału.
Nie, może być więcej niż jeden znak „.”; chcesz lastIndexOf ('.')
Adam Jaskiewicz
-1 za niestosowanie metody, o której myślałem, że używasz. To teraz łącznie +0 ode mnie. Zmień to szybko! ;)
Michael Myers
7
String fileName="foo.bar";int dotIndex=fileName.lastIndexOf('.');if(dotIndex>=0){// to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);}
Użyj metody w com.google.common.io.Filesklasie, jeśli Twój projekt jest już zależny od podstawowej biblioteki Google. Metoda, której potrzebujesz, to getNameWithoutExtension.
Spowoduje to przekształcenie „a.jpg.jpg” na „a” zamiast (poprawnego) „a.jpg”. Jaki jest cel file.length() > 0czeku?
Klaus Gütter
Głównym pytaniem było „jak usunąć rozszerzenie?”, Więc tak, przekształcenie „a.txt.zip” na „a” i „.htaccess” w pustkę. Ta funkcja działa z ciągami znaków, więc nazwy plików nie mogą być zerowe, ale nadal mogą mieć długość 0, szybsze sprawdzenie, czy warto przed analizowaniem symboli. Pozdrowienia.
Odpowiedzi:
To jest rodzaj kodu, którego sami nie powinniśmy robić. Korzystaj z bibliotek do zwykłych rzeczy, zachowaj mózg na trudne rzeczy.
W tym przypadku polecam użycie FilenameUtils.removeExtension () z Apache Commons IO
źródło
źródło
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Ponieważ używanie
String.substring
iString.lastIndex
w jednowierszowym jest dobre, istnieją pewne problemy związane z możliwością radzenia sobie z określonymi ścieżkami plików.Weźmy na przykład następującą ścieżkę:
Użycie jednowierszowego spowoduje:
To jest niepoprawne.
Wynik powinien być
c
, ale ponieważ plik nie miał rozszerzenia, ale ścieżka miała katalog z.
w nazwie, metoda jednowierszowa została oszukana i podała część ścieżki jako nazwę pliku, co nie jest poprawne.Potrzeba czeków
Zainspirowany odpowiedzią skaffmana , przyjrzałem się
FilenameUtils.removeExtension
metodzie Apache Commons IO .Aby odtworzyć jego zachowanie, napisałem kilka testów, jakie powinna spełniać nowa metoda, a są to:
(I to wszystko, co sprawdziłem - prawdopodobnie są inne kontrole, które powinny być na miejscu, o których przeoczyłem).
Implementacja
Oto moja implementacja
removeExtension
metody:Uruchomienie tej
removeExtension
metody z powyższymi testami daje wyniki wymienione powyżej.Metoda została przetestowana z następującym kodem. Ponieważ zostało to uruchomione w systemie Windows, separatorem ścieżki jest znak,
\
który musi zostać poprzedzony znakiem a,\
gdy jest używany jako częśćString
literału.Wyniki były następujące:
Wyniki to pożądane wyniki przedstawione w badaniu, które metoda powinna spełniać.
źródło
System.getProperty("file.separator")
a nie tylkoFile.separator
?/path/to/.htaccess
Swoją drogą w moim przypadku, gdy chciałem szybko rozwiązać problem usunięcia konkretnego rozszerzenia, tak w przybliżeniu zrobiłem:
źródło
źródło
Czy to podchwytliwe pytanie? : p
Nie mogę wymyślić szybszego bankomatu.
źródło
Użyj metody w
com.google.common.io.Files
klasie, jeśli Twój projekt jest już zależny od podstawowej biblioteki Google. Metoda, której potrzebujesz, togetNameWithoutExtension
.źródło
możesz wypróbować tę funkcję, bardzo podstawową
źródło
Znalazłem odpowiedź coolbird jest szczególnie przydatna.
Ale zmieniłem ostatnie stwierdzenia wyniku na:
ponieważ chciałem zwrócić pełną nazwę ścieżki.
źródło
źródło
Użyj wyrażenia regularnego. Ten zastępuje ostatnią kropkę i wszystko po niej.
Możesz także utworzyć obiekt Pattern, jeśli chcesz wstępnie skompilować wyrażenie regularne.
źródło
źródło
"\\."
jako „”. jest specjalny dla wyrażenia regularnego.utwórz nowy plik ze ścieżką do obrazu
źródło
Na org.apache.commons.io.FilenameUtils w wersji 2.4 można znaleźć następującą odpowiedź
źródło
źródło
Zrobiłbym tak:
Od początku do końca, aż do znaku „.” następnie wywołaj podciąg.
Edycja: Może nie golf, ale jest skuteczny :)
źródło
Należy pamiętać o scenariuszach, w których nie ma rozszerzenia pliku lub istnieje więcej niż jedno rozszerzenie pliku
przykład Nazwa pliku: plik | plik.txt | file.tar.bz2
źródło
Spowoduje to wyświetlenie przykładu zarówno dla img, jak i imgLink
źródło
źródło
file.length() > 0
czeku?