Od File
klasy Javy nie obsługuje sondowania za tym idzie, proponuję utworzyć podklasę File
który daje taką możliwość:
package mypackage;
/**
* Enhances java.io.File functionality by adding extension awareness.
*/
public class File extends java.io.File {
/**
* Returns the characters after the last period.
*
* @return An empty string if there is no extension.
*/
public String getExtension() {
String name = getName();
String result = "";
int index = name.lastIndexOf('.');
if(index > 0) {
result = name.substring(index);
}
return result;
}
}
Teraz wystarczy zastąpić wersję pliku dla wersji Java i po połączeniu z odpowiedzią Kurta, daje ci wszystko, czego potrzebujesz.
Należy zauważyć, że użycie podklasy jest idealne, ponieważ jeśli chcesz zmienić zachowanie (ze względu na inny system operacyjny z użyciem innego tokena separatora rozszerzenia), musisz zaktualizować tylko jedną metodę, a cała aplikacja będzie nadal działać. (Lub, jeśli chcesz naprawić błąd, tak jak próbuje wykonać str.substring(-1)
.)
Innymi słowy, jeśli wyodrębnić rozszerzenia pliku w więcej niż jednego miejsca w swojej bazie kodu masz popełnił błąd.
Idąc dalej, jeśli chcesz całkowicie abstrakcyjna wiedza o typie pliku (ponieważ niektóre systemy operacyjne mogą nie używać .
separator), można napisać:
/**
* Enhances java.io.File functionality by adding extension awareness.
*/
public class File extends java.io.File {
public File(String filename) {
super(filename);
}
/**
* Returns true if the file type matches the given type.
*/
public boolean isType(String type) {
return getExtension().equals(type);
}
/**
* Returns the characters after the last period.
*
* @return An empty string if there is no extension.
*/
private String getExtension() {
String name = getName();
String result = "";
int index = name.lastIndexOf('.');
if(index > 0) {
result = name.substring(index);
}
return result;
}
}
uznałbym to znacznie więcej solidne rozwiązanie. Umożliwiłoby to bezproblemowe zastąpienie bardziej zaawansowanego mechanizmu wykrywania typu pliku (analiza zawartości pliku w celu określenia typu), bez konieczności zmiany kodu wywołującego. Przykład:
File file = new File("myfile.txt");
if(file.isType("png")) {
System.out.println("PNG image found!");
}
Jeśli użytkownik zapisany „myfile.png” AS „pliku mojplik.txt”, obraz będzie nadal być przetwarzane, ponieważ zaawansowana wersja (nie pokazane tutaj) będzie wyglądać na „PNG” marker, który rozpoczyna każdy pojedynczy plik PNG w świecie (cyber).
Jaki kod masz do tej pory? –
Przechodząc do komentarza do rozwiązania @Kurt to zadanie domowe. Możesz usunąć ten tag. –
To nie jest praca domowa. Dzielę to za pomocą indexOf() i subString(). Po prostu potrzebujemy, dlaczego nie możemy podzielić tego przy użyciu split() ...? Wciąż nie dostałem odpowiedzi na to. – yuvaraj