How do I get the file extension of a file in Java?

JavaFileIo

Java Problem Overview


Just to be clear, I'm not looking for the MIME type.

Let's say I have the following input: /path/to/file/foo.txt

I'd like a way to break this input up, specifically into .txt for the extension. Is there any built in way to do this in Java? I would like to avoid writing my own parser.

Java Solutions


Solution 1 - Java

In this case, use FilenameUtils.getExtension from Apache Commons IO

Here is an example of how to use it (you may specify either full path or just file name):

import org.apache.commons.io.FilenameUtils;

// ...

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

Maven dependency:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Gradle Groovy DSL

implementation 'commons-io:commons-io:2.6'

Gradle Kotlin DSL

implementation("commons-io:commons-io:2.6")

Others https://search.maven.org/artifact/commons-io/commons-io/2.6/jar

Solution 2 - Java

Do you really need a "parser" for this?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

Assuming that you're dealing with simple Windows-like file names, not something like archive.tar.gz.

Btw, for the case that a directory may have a '.', but the filename itself doesn't (like /path/to.a/file), you can do

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}

Solution 3 - Java

private String getFileExtension(File file) {
	String name = file.getName();
	int lastIndexOf = name.lastIndexOf(".");
	if (lastIndexOf == -1) {
		return ""; // empty extension
	}
	return name.substring(lastIndexOf);
}

Solution 4 - Java

If you use Guava library, you can resort to Files utility class. It has a specific method, getFileExtension(). For instance:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

In addition you may also obtain the filename with a similar function, getNameWithoutExtension():

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo

Solution 5 - Java

If on Android, you can use this:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());
		

Solution 6 - Java

This is a tested method

public static String getExtension(String fileName) {
	char ch;
	int len;
	if(fileName==null || 
			(len = fileName.length())==0 || 
			(ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
			 ch=='.' ) //in the case of . or ..
		return "";
	int dotInd = fileName.lastIndexOf('.'),
		sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
	if( dotInd<=sepInd )
		return "";
	else
		return fileName.substring(dotInd+1).toLowerCase();
}

And test case:

@Test
public void testGetExtension() {
	assertEquals("", getExtension("C"));
	assertEquals("ext", getExtension("C.ext"));
	assertEquals("ext", getExtension("A/B/C.ext"));
	assertEquals("", getExtension("A/B/C.ext/"));
	assertEquals("", getExtension("A/B/C.ext/.."));
	assertEquals("bin", getExtension("A/B/C.bin"));
	assertEquals("hidden", getExtension(".hidden"));
	assertEquals("dsstore", getExtension("/user/home/.dsstore"));
	assertEquals("", getExtension(".strange."));
	assertEquals("3", getExtension("1.2.3"));
	assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}

Solution 7 - Java

In order to take into account file names without characters before the dot, you have to use that slight variation of the accepted answer:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}


"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"

Solution 8 - Java

String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

return ".txt"

if you want only "txt", make path.lastIndexOf(".") + 1

Solution 9 - Java

If you use Spring framework in your project, then you can use StringUtils

import org.springframework.util.StringUtils;

StringUtils.getFilenameExtension("YourFileName")

Solution 10 - Java

My dirty and may tiniest using String.replaceAll:

.replaceAll("^.*\\.(.*)$", "$1")

Note that first * is greedy so it will grab most possible characters as far as it can and then just last dot and file extension will be left.

Solution 11 - Java

As is obvious from all the other answers, there's no adequate "built-in" function. This is a safe and simple method.

String getFileExtension(File file) {
	if (file == null) {
		return "";
	}
	String name = file.getName();
	int i = name.lastIndexOf('.');
	String ext = i > 0 ? name.substring(i + 1) : "";
	return ext;
}

Solution 12 - Java

Here is another one-liner for Java 8.

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

It works as follows:

  1. Split the string into an array of strings using "."

  2. Convert the array into a stream

  3. Use reduce to get the last element of the stream, i.e. the file extension

Solution 13 - Java

How about (using Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];

Solution 14 - Java

If you plan to use Apache commons-io,and just want to check the file's extension and then do some operation,you can use this,here is a snippet:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}

Solution 15 - Java

How about JFileChooser? It is not straightforward as you will need to parse its final output...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

which is a MIME type...

OK...I forget that you don't want to know its MIME type.

Interesting code in the following link: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

Related question: https://stackoverflow.com/questions/941272/how-do-i-trim-a-file-extension-from-a-string-in-java

Solution 16 - Java

Here's a method that handles .tar.gz properly, even in a path with dots in directory names:

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlash is created to make finding afterLastBackslash quicker since it won't have to search the whole string if there are some slashes in it.

The char[] inside the original String is reused, adding no garbage there, and the JVM will probably notice that afterLastSlash is immediately garbage in order to put it on the stack instead of the heap.

Solution 17 - Java

// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

extension should have ".txt" in it when run.

Solution 18 - Java

This particular question gave me a lot of trouble then i found a very simple solution for this problem which i'm posting here.

file.getName().toLowerCase().endsWith(".txt");

That's it.

Solution 19 - Java

How about REGEX version:

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

or with null extension supported:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

result for *nix:
path: /root/docs/
name: readme
Extention: txt

for windows, parsePath("c:\windows\readme.txt"):
path: c:\windows<br> name: readme
Extention: txt

Solution 20 - Java

Here's the version with Optional as a return value (cause you can't be sure the file has an extension)... also sanity checks...

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

	public static Optional<String> getFileExtension(File file) {
		if (file == null) {
			throw new NullPointerException("file argument was null");
		}
		if (!file.isFile()) {
			throw new IllegalArgumentException("getFileExtension(File file)"
					+ " called on File object that wasn't an actual file"
					+ " (perhaps a directory or device?). file had path: "
					+ file.getAbsolutePath());
		}
		String fileName = file.getName();
		int i = fileName.lastIndexOf('.');
		if (i > 0) {
			return Optional.of(fileName.substring(i + 1));
		} else {
			return Optional.empty();
		}
	}
}

Solution 21 - Java

String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");

Solution 22 - Java

Here I made a small method (however not that secure and doesnt check for many errors), but if it is only you that is programming a general java-program, this is more than enough to find the filetype. This is not working for complex filetypes, but those are normally not used as much.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}

Solution 23 - Java

Getting File Extension from File Name

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfExtension(String filename) {
    if (filename == null) {
        return -1;
    }
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
    int lastSeparator = indexOfLastSeparator(filename);
    return (lastSeparator > extensionPos ? -1 : extensionPos);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfLastSeparator(String filename) {
    if (filename == null) {
        return -1;
    }
    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
    return Math.max(lastUnixPos, lastWindowsPos);
}

Credits

  1. Copied from Apache FileNameUtils Class - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils.getExtension%28java.lang.String%29

Solution 24 - Java

Without use of any library, you can use the String method split as follows :

        String[] splits = fileNames.get(i).split("\\.");
        
        String extension = "";
        
        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }

Solution 25 - Java

    private String getExtension(File file)
        {
            String fileName = file.getName();
            String[] ext = fileName.split("\\.");
            return ext[ext.length -1];
        }

Solution 26 - Java

Just a regular-expression based alternative. Not that fast, not that good.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}

Solution 27 - Java

I like the simplicity of spectre's answer, and linked in one of his comments is a link to another answer that fixes dots in file paths, on another question, made by EboMike.

Without implementing some sort of third party API, I suggest:

private String getFileExtension(File file) {
    
    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

Something like this may be useful in, say, any of ImageIO's write methods, where the file format has to be passed in.

Why use a whole third party API when you can DIY?

Solution 28 - Java

The fluent way:

> public static String fileExtension(String fileName) { > return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0) > .filter(i-> i > fileName.lastIndexOf(File.separator)) > .map(fileName::substring).orElse(""); > }

Solution 29 - Java

try this.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg

Solution 30 - Java

  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }

Solution 31 - Java

I found a better way to find extension by mixing all above answers

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }

Solution 32 - Java

Java has a built-in way of dealing with this, in the java.nio.file.Files class, that may work for your needs:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

Note that this static method uses the specifications found here to retrieve "content type," which can vary.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionlongdaView Question on Stackoverflow
Solution 1 - JavaJuan RojasView Answer on Stackoverflow
Solution 2 - JavaEboMikeView Answer on Stackoverflow
Solution 3 - Javaluke1985View Answer on Stackoverflow
Solution 4 - JavaJeanValjeanView Answer on Stackoverflow
Solution 5 - JavaintrepidisView Answer on Stackoverflow
Solution 6 - JavayavuzkavusView Answer on Stackoverflow
Solution 7 - JavaSylvain LerouxView Answer on Stackoverflow
Solution 8 - JavaVelocityPulseView Answer on Stackoverflow
Solution 9 - JavaYiao SUNView Answer on Stackoverflow
Solution 10 - JavaEbrahim ByagowiView Answer on Stackoverflow
Solution 11 - JavaintrepidisView Answer on Stackoverflow
Solution 12 - JavaJens.Huehn_at_SlideFab.comView Answer on Stackoverflow
Solution 13 - JavaNinju BohraView Answer on Stackoverflow
Solution 14 - JavaGeng JiawenView Answer on Stackoverflow
Solution 15 - JavaeeeView Answer on Stackoverflow
Solution 16 - JavaOlatheView Answer on Stackoverflow
Solution 17 - JavalongdaView Answer on Stackoverflow
Solution 18 - JavaVikram BhardwajView Answer on Stackoverflow
Solution 19 - JavaDmitry SokolyukView Answer on Stackoverflow
Solution 20 - JavaschuttekView Answer on Stackoverflow
Solution 21 - JavaAlfavilleView Answer on Stackoverflow
Solution 22 - JavaRivalionView Answer on Stackoverflow
Solution 23 - JavaVasanthView Answer on Stackoverflow
Solution 24 - JavaFarahView Answer on Stackoverflow
Solution 25 - JavaViknesh TPKView Answer on Stackoverflow
Solution 26 - JavashapiyView Answer on Stackoverflow
Solution 27 - JavaDDPWNAGEView Answer on Stackoverflow
Solution 28 - JavaNolleView Answer on Stackoverflow
Solution 29 - JavaAdnaneView Answer on Stackoverflow
Solution 30 - JavaAshish PancholiView Answer on Stackoverflow
Solution 31 - JavaRaghav SatyadevView Answer on Stackoverflow
Solution 32 - JavaNick GiampietroView Answer on Stackoverflow