我需要从文件名中提取扩展名。获取特殊情况下的文件扩展名,例如tar.gz
我知道这可以为单一的扩展名如.gz
或.tar
使用filePath.lastIndexOf('.')
或使用工具的方法,如FilenameUtils.getExtension(filePath)
Apache的公地IO来完成。
但是,如果我有一个扩展名为.tar.gz
的文件怎么办?如何管理包含.
字符的扩展名的文件?
我需要从文件名中提取扩展名。获取特殊情况下的文件扩展名,例如tar.gz
我知道这可以为单一的扩展名如.gz
或.tar
使用filePath.lastIndexOf('.')
或使用工具的方法,如FilenameUtils.getExtension(filePath)
Apache的公地IO来完成。
但是,如果我有一个扩展名为.tar.gz
的文件怎么办?如何管理包含.
字符的扩展名的文件?
如果您知道什么扩展很重要,您可以直接检查它们。你必须知道的扩展的集合,像这样:
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)
。
找到一个简单的方法。使用substring
仅获取文件名,而indexOf
而不是lastIndexOf
获得第一个'。'。并在其后扩展
那么,如果我给你一个'program.logs.tar.gz'文件,你的程序会考虑扩展名? –
同意,这对嵌入版本号的文件不起作用。 – grkvlt
您可以获取路径的文件名部分,在.
上拆分并将数组中的最后0,1或2个元素作为扩展名。
当然,如果.tar.*
(gz,bz2等)是您唯一的边缘情况,那么可以建立一个解决方案来过滤.tar的文件名。并将其用作提取扩展名的位置(包含.tar部分)。
一个文件只能有一个扩展名!
如果你有一个文件test.tar.gz
,
.gz
是扩展和test.tar
是基名!.tar
在这种情况下是基本名称的一部分,而不是扩展的一部分!
如果你想有一个编码为tar
和gz
的文件,你应该把它叫做.tgz
。要使用.tar.gz
是不好的做法,如果您需要处理这些文件,您应该制定一个解决方法,如将文件重命名为test.tgz
。
请注意不同:“扩展名”是应用程序定义的任何内容。从操作系统的角度来看,没有“扩展”这样的东西。 – Ingo
一个操作系统pov,嗯......它可能更多的保存说从FS pov。 –
实际上,扩展名不是'.tar.gz'。扩展名 - 根据定义 - 是'.gz'。 '.tar'部分仅供参考。如果文件以'.test.zip'结尾,你可以考虑扩展名'.zip',不是吗? –
和'commons-io-2.4.jar'在这种情况下你会期望什么? – vels4j
@ThorstenDittmar处理* .tar.gz是合理的,就像* .tgz一样,介意你。 – Ingo