如何获得Java文件的文件扩展名?

只是要清楚,我不是在寻找MIMEtypes。

假设我有以下input: /path/to/file/foo.txt

我想要一个方法来打破这个input,特别是扩展名为.txt 。 有什么build立在Java中做到这一点? 我想避免写我自己的parsing器。

在这种情况下,使用Apache Commons IO中的 FilenameUtils.getExtension

这里是一个如何使用它的例子(你可以指定完整path或只是文件名):

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

你真的需要一个“parsing器”吗?

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

假设你正在处理简单的Windows类文件名,而不是像archive.tar.gz

顺便说一句,目录可能有一个“。”,但文件名本身不(如/path/to.a/file )的情况下,你可以做

 String extension = ""; int i = fileName.lastIndexOf('.'); int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\')); if (i > p) { extension = fileName.substring(i+1); } 
 private String getFileExtension(File file) { String name = file.getName(); try { return name.substring(name.lastIndexOf(".") + 1); } catch (Exception e) { return ""; } } 

如果您使用Guava库,则可以使用Files实用程序类。 它有一个特定的方法getFileExtension() 。 例如:

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

另外你也可以用类似的函数getNameWithoutExtension()来获得文件名:

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

如果在Android上,你可以使用这个:

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

为了在点之前考虑没有字符的文件名,必须使用接受的答案的轻微变化:

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

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

我的脏,可能最小使用String.replaceAll :

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

请注意,第一个*是贪婪的,所以它会尽可能抓取最可能的字符,然后只剩下点和文件扩展名。

如果你打算使用Apache commons-io,只想检查文件的扩展名,然后做一些操作,可以使用这个 ,下面是一个片段:

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

如何(使用Java 1.5 RegEx):

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

JFileChooser如何? 这不是直接的,因为你需要parsing它的最终输出…

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

这是一个MIMEtypes…

好的…我忘了你不想知道它的MIMEtypes。

有趣的代码在以下链接: 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; } 

相关问题: 如何从Java中的string修剪文件扩展名?

这里有一个方法可以正确处理.tar.gz ,即使是在目录名称中有一个点的path:

 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创build后可以更快findafterLastBackslash因为如果在其中有一些斜线,它不必search整个string。

原始Stringchar[]被重用,不会在那里添加垃圾, JVM可能会注意到afterLastSlash立即被垃圾回收,而不是堆 。

这是一个testing的方法

 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(); } 

和testing案例:

 @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")); } 
 // Modified from EboMike's answer String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.')); 

运行时扩展名应该有“.txt”。

在这里,我做了一个小方法(但不是很安全,不检查很多错误),但如果只是你编写一个通用的java程序,这足以find文件types。 这不适用于复杂的文件types,但通常不会那么多。

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

如果不使用任何库,可以使用String方法拆分,如下所示:

  String[] splits = fileNames.get(i).split("\\."); String extension = ""; if(splits.length >= 2) { extension = splits[splits.length-1]; } 
 String extension = com.google.common.io.Files.getFileExtension("fileName.jpg"); 

从文件名获取文件扩展名

 /** * 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); } 

积分

  1. 从Apache FileNameUtils类复制 – 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%

这里是可选的作为返回值的版本(因为你不能确定该文件有一个扩展名)…还有理智检查…

 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(); } } } 

REGEX版本如何?

 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)); } 

或支持null扩展:

 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); 

结果为* nix:
path:/ root / docs /
名称:自述文件
延伸:txt

对于Windows,parsePath(“c:\ windows \ readme.txt”):
path:c:\ windows \
名称:自述文件
延伸:txt

 path = "/Users/test/test.txt" extension = path.substring(path.lastIndexOf("."), path.length()); 

返回“.txt”

如果您只需要“txt”, path.lastIndexOf(".") + 1

只是一个基于正则expression式的select。 不是那么快,不是那么好。

 Pattern pattern = Pattern.compile("\\.([^.]*)$"); Matcher matcher = pattern.matcher(fileName); if (matcher.find()) { String ext = matcher.group(1); } 

这个特殊的问题给了我很多麻烦,然后我find了一个非常简单的解决scheme,我在这里发布这个问题。

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

而已。

尝试这个。

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

您可以使用java.io包中的Java7function

 Files.probeContentType(path); 

请参阅下面的代码片段

 public static String returnContentType(String pathText) throws Exception { // obtain Path object that represents the file Path path = Paths.get(pathText); // probe the content String contentType = Files.probeContentType(path); // return content type return contentType; } 

Java在java.nio.file.Files类中有一个内置的处理方法,可以满足您的需求:

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

请注意,此静态方法使用此处find的规范来检索“内容types”,这可能会有所不同。

让'名字'是扩展名文件的文件的名称。

  int len=name.length(); int i=0; String eXt; while(i<len){ if(name.charAt(i)=='.'){ eXt=(String) name.subSequence(i, len); break; } i++; }