2013-07-16 71 views
5

我需要从文件名中提取扩展名。获取特殊情况下的文件扩展名,例如tar.gz

我知道这可以为单一的扩展名如.gz.tar使用filePath.lastIndexOf('.')或使用工具的方法,如FilenameUtils.getExtension(filePath) Apache的公地IO来完成。

但是,如果我有一个扩展名为.tar.gz的文件怎么办?如何管理包含.字符的扩展名的文件?

+4

实际上,扩展名不是'.tar.gz'。扩展名 - 根据定义 - 是'.gz'。 '.tar'部分仅供参考。如果文件以'.test.zip'结尾,你可以考虑扩展名'.zip',不是吗? –

+1

和'commons-io-2.4.jar'在这种情况下你会期望什么? – vels4j

+0

@ThorstenDittmar处理* .tar.gz是合理的,就像* .tgz一样,介意你。 – Ingo

回答

3

如果您知道什么扩展很重要,您可以直接检查它们。你必须知道的扩展的集合,像这样:

List<String> EXTS = Arrays.asList("tar.gz", "tgz", "gz", "zip"); 

你可以得到的(第一个)最长匹配的扩展是这样的:

String getExtension(String fileName) { 
    String found = null; 
    for (String ext : EXTS) { 
    if (fileName.endsWith("." + ext)) { 
     if (found == null || found.length() < ext.length()) { 
     found = ext; 
     } 
    } 
    } 
    return found; 
} 

所以调用getExtension("file.tar.gz")将返回"tar.gz"

如果您有混合大小写的名称,可以尝试将循环内的支票更改为filename.toLowerCase().endsWith("." + ext)

0

找到一个简单的方法。使用substring仅获取文件名,而indexOf而不是lastIndexOf获得第一个'。'。并在其后扩展

+2

那么,如果我给你一个'program.logs.tar.gz'文件,你的程序会考虑扩展名? –

+0

同意,这对嵌入版本号的文件不起作用。 – grkvlt

0

您可以获取路径的文件名部分,在.上拆分并将数组中的最后0,1或2个元素作为扩展名。

当然,如果.tar.*(gz,bz2等)是您唯一的边缘情况,那么可以建立一个解决方案来过滤.tar的文件名。并将其用作提取扩展名的位置(包含.tar部分)。

2

一个文件只能有一个扩展名!

如果你有一个文件test.tar.gz

  • .gz是扩展和
  • test.tar是基名!

.tar在这种情况下是基本名称的一部分,而不是扩展的一部分!

如果你想有一个编码为targz的文件,你应该把它叫做.tgz。要使用.tar.gz是不好的做法,如果您需要处理这些文件,您应该制定一个解决方法,如将文件重命名为test.tgz

+1

请注意不同:“扩展名”是应用程序定义的任何内容。从操作系统的角度来看,没有“扩展”这样的东西。 – Ingo

+0

一个操作系统pov,嗯......它可能更多的保存说从FS pov。 –

相关问题