在java中获取文件扩展名[重复]

Posted

技术标签:

【中文标题】在java中获取文件扩展名[重复]【英文标题】:Get file extension in java [duplicate] 【发布时间】:2012-09-12 06:20:35 【问题描述】:

我在获取给定文件名的扩展名时遇到问题。我收到 1 个文件 URL。 可能是这样的

/var/www.dir/file.tar.gz OR /var/www.dir/file.exe

现在我需要从给定的 URL 中拆分文件扩展名(如 .tar.gz 或 .exe)。 URL 由用户动态给出。哪位大神帮帮忙,怎么解决这个问题

【问题讨论】:

如果文件名为read.me.tar.gz,您希望扩展名是tar.gz 还是me.tar.gz 【参考方案1】:

这不是一项可怕的复杂任务,而是反复发生的任务。看起来像是可以自己快速生产的东西——而且确实可以。但是您仍然应该为此使用现成的、经过测试的库:Apache IO Tools,特别是FilenameUtils#getExtension。这样可以避免令人毛骨悚然的错误或不一致。此外,您还会获得许多其他有用的、经过测试的东西。

当然,在双文件扩展名的情况下,您可能需要多次使用这些方法,因为库无法猜测您需要扩展名的级别。它是一个.gz 文件,只有解压缩后它是一个.tar 文件。

【讨论】:

【参考方案2】:

您可以使用lastIndexOfindexOf 的组合:

String s = "/var/www.dir/file.tar.gz";
String file = s.substring(s.lastIndexOf("/"));
String extension = file.substring(file.indexOf(".")); // .tar.gz

DEMO.

【讨论】:

【参考方案3】:

你可以这样做:

String str = "/var/www.dir/file.tar.gz";
Matcher m = Pattern.compile(".*/.*?(\\..*)").matcher(str);
if (m.matches()) 
   fileExtension = m.group(1);

【讨论】:

嘿,其中一个问题可能是其中包含点的路径,例如 git 存储库。例如,/my/path/to/a.git/repositry 不,仍然可以使用,表达式的第一部分是 greedy 我想当我第一次看到这个帖子时我错过了。剩下的唯一问题是处理没有扩展名的文件,但我猜这不是必须在这里处理的情况。【参考方案4】:

似乎最简单的解决方案是为异常值创建单独的案例(如 .tar.gz)并将其余的视为相同(即处理最后一个 . 字符之后的所有内容)。

包含多个. 字符的扩展非常罕见,以至于您不需要复杂的方法来解析出您需要的内容。所以:

int length = url.length();
String extension = null;
if(url.substring(length-7).equalsIgnoreCase(".tar.gz")) 
    //special case
 else 
    extension = url.substring(url.lastIndexOf("."));

【讨论】:

这不是像 .tar.gz 那样的意思,点的数量可能会变长。我们无法确定它有多长??? 扩展名很少包含一个以上的 '.'与创建正则表达式相比,处理这些特殊情况可能更容易。当然,您可以假设第一次出现 '.' 之后的所有内容。是扩展名,但如果文件名包含该字符,则会产生其自身的问题。 是的,这是真的。我接受你的话@Jeff 根据定义,扩展名仅是最少的 '.' 之后的部分。在一个文件名中。所以一个文件AAbc.tar。 gz 是一个压缩文件。压缩 tar 档案并不重要,这只对您来说很方便。如果这对您很重要,您应该说明原因。【参考方案5】:

我刚刚意识到我读错了你的问题。不过,您可以用类似的方法收集扩展名

String yourString = "/your/whole/path.ext.si.ons";
String[] pathPieces = yourString.split("/"); // [ "your", "whole", "path.ext.si.ons" ]

String lastPiece = pathPieces[pathPieces.length - 1];
String[] namePieces = lastPiece.split("."); // [ "path", "ext", "si", "ions" ]

此时,第一部分可能是您的名字,其余部分将是扩展名。然后,您可以加入这些以获得您的扩展类型。

【讨论】:

【参考方案6】:

您可以使用此代码获取文件扩展名

public static String getFileExtension(String filename)

if (filename == null) 
            return null;

int lastUnixPos = filename.lastIndexOf('/');
int lastWindowsPos = filename.lastIndexOf('\\');
int indexOfLastSeparator = Math.max(lastUnixPos, lastWindowsPos);
int extensionPos = filename.lastIndexOf('.');
int lastSeparator = indexOfLastSeparator;
int indexOfExtension = lastSeparator > extensionPos ? -1 : extensionPos;
int index = indexOfExtension;
if (index == -1) 
  return "";
 else 
  return filename.substring(index + 1);


【讨论】:

【参考方案7】:

假设 URL 模式为:"/somurl/blah-blah/filename.extension"。 我建议使用以下代码 sn-p 作为您的问题的解决方案。

String getFileExtension(String url) 
    String[] urlSplit = url.split("/");
    String filename = urlSplit[urlSplit.length - 1];
    String[] nameSplit = filename.split("[.]");
    StringBuffer fileExtension = new StringBuffer();
// to prevent appending . after extension type                                      
    if (nameSplit.length > 1) 
        for (int index = 1; index < nameSplit.length; index++) 
            if (index != nameSplit.length - 1)
                fileExtension.append(nameSplit[index] + ".");
            else
                fileExtension.append(nameSplit[index]);
        
     else 
        fileExtension.append(nameSplit[0]);
    
    return fileExtension.toString();

【讨论】:

不错。但是对于这样的 url 类型——“scontent-frt3-2.xx.fbcdn.net/v/t1.0-0/cp0/e15/q65/p261x260/…”,你会怎么说呢?【参考方案8】:

获取文件输入,然后使用 '.' 分割它作为分隔符也许? 设置分隔符:

Scanner line_scanner = new Scanner(line).useDelimiter(".");

读取文件 URL 两次,一次用于文件名,一次用于扩展名。

【讨论】:

这将在第一次读取时返回 /var/www.dir/file,在第二次读取时返回 tar 然后用 if 循环匹配 'tar' 'exe' 等字符串,然后根据需要处理它们

以上是关于在java中获取文件扩展名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Bash 中获取文件的扩展名 [重复]

在PHP中获取上传文件扩展名的最佳方法/实践是啥[重复]

在没有扩展名的目录中获取文件名 - Python [重复]

从内容而不是从扩展名中获取文件类型[重复]

从文件名中获取扩展名,如变量[重复]

获取文件扩展名[重复]