HOWTO · Java
Ottieni l'estensione di un file in Java
Questo articolo spiega come ottenere l'estensione di un file in Java.
In questa pagina
L’estensione di un file è il suffisso dopo l’ultimo punto in un nome, come pdf in student-records.pdf. Java non offre un metodo dedicato per ottenere l’estensione su File o String, quindi puoi chiamare una utility come FilenameUtils di Apache Commons IO oppure individuare da solo l’ultimo punto con i metodi di String. Entrambi gli approcci sono mostrati di seguito, insieme alle regole che li mantengono corretti sui percorsi completi.
Ottieni l’estensione di un file con Apache Commons IO
FilenameUtils.getExtension() restituisce il testo dopo l’ultimo punto in un nome di file o percorso. Conosce già entrambi i separatori / e \, quindi un punto nel nome di una directory non viene mai scambiato per un’estensione, e restituisce "" quando il nome non ha un’estensione utilizzabile.
La classe non fa parte del JDK, quindi aggiungi la dipendenza commons-io al progetto tramite Maven o Gradle, oppure metti il JAR nel classpath. Dopo aver aggiunto la dipendenza, importa org.apache.commons.io.FilenameUtils e chiama String extension = FilenameUtils.getExtension(fileName);. Con fileName impostato a student-records.pdf, restituisce pdf.
Poiché la libreria esterna è necessaria in fase di compilazione, questa chiamata API è mostrata inline; gli esempi eseguibili qui sotto usano solo il JDK.
Estrai un’estensione con i metodi delle stringhe di Java
Non serve alcuna libreria per un semplice nome di file: lastIndexOf('.') trova l’ultimo punto e substring() prende tutto ciò che lo segue.
Esegui questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
public class SimpleTesting {
public static void main(String[] args) {
String fileName = "student-records.pdf";
int dot = fileName.lastIndexOf('.');
String extension = dot > 0 ? fileName.substring(dot + 1) : "";
System.out.println("File extension is : " + extension);
}
}
Output:
File extension is : pdf
Il controllo dot > 0 copre due casi in cui non c’è alcuna estensione da segnalare: readme produce "" perché lastIndexOf restituisce -1, e un punto iniziale come in .env è trattato come un marcatore del nome piuttosto che come separatore dell’estensione. Ciò che questa forma breve non può vedere è se il punto si trova nella parte di directory del nome — per questo serve la versione consapevole del percorso presentata qui sotto.
Gestisci percorsi e casi limite
In un percorso completo il punto dell’estensione deve trovarsi dopo l’ultimo separatore di percorso. L’helper qui sotto controlla sia / che \, quindi una cartella con un punto come data.d non finisce nel risultato. Restituisce "" per un punto mancante, un nome con punto iniziale e un nome che termina con un punto:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
public class SimpleTesting {
static String fileExtension(String path) {
if (path == null) {
return "";
}
int dot = path.lastIndexOf('.');
int sep = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
if (dot <= sep + 1 || dot == path.length() - 1) {
return "";
}
return path.substring(dot + 1);
}
public static void main(String[] args) {
String[] names = {
"folder/s.gr/fg/student-records.pdf",
"C:\\data.d\\reports\\summary.txt",
"folder.d/README",
"folder/.hidden",
"archive.tar."
};
for (String name : names) {
System.out.println(name + " -> '" + fileExtension(name) + "'");
}
}
}
Output:
folder/s.gr/fg/student-records.pdf -> 'pdf'
C:\data.d\reports\summary.txt -> 'txt'
folder.d/README -> ''
folder/.hidden -> ''
archive.tar. -> ''
Il punto è confrontato con sep + 1, non solo con sep, quindi un punto nella prima posizione del segmento finale del nome produce comunque "" — questo helper tratta .hidden come un file nascosto senza estensione. FilenameUtils.getExtension() applica lo stesso controllo del separatore ma fa una scelta diversa in quel caso e restituisce hidden per .hidden; entrambi concordano su "" per folder.d/README e archive.tar.. Scegli la convenzione che i tuoi chiamanti si aspettano.
Scegli l’approccio giusto
Usa FilenameUtils.getExtension() quando Apache Commons IO è già nel classpath o quando vuoi un risultato ben collaudato con una sola chiamata — gestisce da subito entrambi i separatori e le directory con punti. Scegli la versione con String quando vuoi zero dipendenze, non puoi aggiungere una libreria o ti serve una regola personalizzata come il comportamento per il punto iniziale mostrato sopra; in quel caso i controlli su separatore e punto finale sono a tuo carico.
Per la maggior parte dei progetti che fanno già I/O su file, FilenameUtils.getExtension() è la scelta più semplice e sicura. Per una piccola utility o un classpath limitato, l’helper consapevole del percorso copre lo stesso terreno in poche righe.