IT-Swarm.Net

如何在Java中获取文件的文件扩展名?

为了清楚起见,我不是在寻找MIME类型。.

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

我想要一种方法来打破这个输入,特别是扩展的.txt。在Java中有没有内置的方法来做到这一点?我想避免编写自己的解析器。.

422
longda

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

以下是如何使用它的示例(您可以指定完整路径或仅指定文件名):

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

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

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

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);
}
278
EboMike
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}
89
spectre

如果你使用 Guava library,你可以使用 Files utility class。它有一个特定的方法, 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
79
JeanValjean

如果在Android上,您可以使用此:

String ext = Android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());
28
intrepidis

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

String extension = "";

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

"file.doc" => "doc" "file.doc.gz" => "gz" ".doc" => "doc"
15
Sylvain Leroux

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

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

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

10
Ebrahim Byagowi

这是一种经过测试的方法

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

和测试用例:

@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"));
}
9
yavuzkavus

从所有其他答案中可以明显看出,没有足够的“内置”功能。这是一种安全而简单的方法。.

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;
}
8
intrepidis

怎么样(使用Java 1.5 RegEx):

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

如果您打算使用Apache commons-io,只想查看文件的扩展名然后进行一些操作,可以使用 this ,这里是一个片段:

if(FilenameUtils.isExtension(file.getName(),"Java")) {
    someoperation();
}
6
Geng Jiawen

这是一个正确处理.tar.gz的方法,即使在目录名中带点的路径中:

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是为了更快地找到afterLastBackslash,因为如果有一些斜杠,它将不必搜索整个字符串。.

原始String中的char[]被重用,在那里不添加垃圾,和 JVM可能会注意到afterLastSlash立即是垃圾,以便将它放在堆栈而不是堆 。.

4
Olathe

JFileChooser怎么样?这并不简单,因为您需要解析其最终输出...

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

这是一个MIME类型...

好的......我忘了你不想知道它的MIME类型。.

以下链接中有趣的代码: 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修剪文件扩展名?

4
eee

这是Java 8的另一个单行程序。.

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

它的工作原理如下:

  1. 使用“。”将字符串拆分为字符串数组。
  2. 将数组转换为流
  3. 使用reduce来获取流的最后一个元素,即文件扩展名
2
// Modified from EboMike's answer

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

扩展名在运行时应该包含“.txt”。.

2
longda

这是带有Optional作为返回值的版本(因为你无法确定文件是否有扩展名)...还有完整性检查......

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

怎么样 _正则表达式_ 版本:

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的结果:
路径:/ root/docs /
姓名:自述
延伸:txt

对于windows,parsePath(“c:\ windows\readme.txt”):
路径:c:\ windows \
姓名:自述
延伸:txt

2
Dmitry Sokolyuk
path = "/Users/test/test.txt"

extension = path.substring(path.lastIndexOf("."), path.length());

返回“.text”

如果你只想要“文本”,请path.lastIndexOf(".") + 1

2
VelocityPulse

从文件名获取文件扩展名

/**
 * 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
1
Vasanth

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

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }
1
Farah
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");
1
Alfaville

在这里,我做了一个小方法(但不安全并且不检查许多错误),但如果只是你编写一个普通的Java程序,这就足以找到文件类型了。这不适用于复杂的文件类型,但通常不会使用那些。.

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

这个特殊的问题给了我很多麻烦,然后我找到了一个非常简单的解决方案来解决这个问题,我在这里发布。.

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

而已。.

0
vikram Bhardwaj

只是一个基于正则表达式的替代方案不是那么快,不是那么好。.

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

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

我喜欢简单的 幽灵的答案 ,并在他的一条评论中链接到另一个答案的链接,该答案修复了文件路径中的点,在另一个问题上, 由EboMike制作 。.

如果没有实现某种第三方API,我建议:

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
}

像这样的东西可能在 任何ImageIO的write方法 中都有用,其中必须传入文件格式。.

为什么在DIY时可以使用整个第三方API?

0
DDPWNAGE

通过混合以上所有答案,我找到了一种更好的方法来查找扩展

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));
    }
0
Raghav Satyadev