(不包括任何外部库。)
在不假设任何文件名的情况下,删除Java中文件扩展名的最有效方法是什么?
一些例子和预期结果:
(或者最后一个应该隐藏?)
编辑:原始问题假设输入是文件名(不是文件路径)。由于一些答案是在谈论文件路径,因此这些函数也应该适用于以下情况:
Sylvain M的答案很好地处理了这个特例。
答案 0 :(得分:26)
使用apache http://commons.apache.org/io/
中的常用iopublic static String removeExtension(String filename)
仅供参考,源代码在这里:
Arg,我刚试了一下......
System.out.println(FilenameUtils.getExtension(".polop")); // polop
System.out.println(FilenameUtils.removeExtension(".polop")); // empty string
所以,这个解决方案似乎不是很好...... 即使使用常见的io,你也必须使用removeExtension()getExtension()indexOfExtension()......
答案 1 :(得分:12)
我将对此使用{-1}}的两个arg版本以便删除一些特殊情况检查代码,并希望使意图更具可读性。信用转到Justin 'jinguy' Nelson以提供此方法的基础:
lastIndexOf
对我而言,这比特殊外壳隐藏文件和不包含点的文件更清晰。它也更清楚我理解你的规范;类似于“删除最后一个点及其后的所有内容,假设它存在且不是文件名的第一个字符”。
请注意,此示例还将字符串视为输入和输出。由于大多数抽象需要public static String removeExtention(String filePath) {
// These first few lines the same as Justin's
File f = new File(filePath);
// if it's a directory, don't remove the extention
if (f.isDirectory()) return filePath;
String name = f.getName();
// Now we know it's a file - don't need to do any special hidden
// checking or contains() checking because of:
final int lastPeriodPos = name.lastIndexOf('.');
if (lastPeriodPos <= 0)
{
// No period after first character - return name as it was passed in
return filePath;
}
else
{
// Remove the last period and everything after it
File renamed = new File(f.getParent(), name.substring(0, lastPeriodPos));
return renamed.getPath();
}
}
个对象,如果那些是输入和输出,那么它将更加清晰。
答案 2 :(得分:11)
这将采用文件路径,然后返回没有扩展名的文件的新名称。
public static String removeExtention(String filePath) {
File f = new File(filePath);
// if it's a directory, don't remove the extention
if (fisDirectory()) return f.getName();
String name = f.getName();
// if it is a hidden file
if (name.startsWith(".")) {
// if there is no extn, do not rmove one...
if (name.lastIndexOf('.') == name.indexOf('.')) return name;
}
// if there is no extention, don't do anything
if (!name.contains(".") return name;
// Otherwise, remove the last 'extension type thing'
return name.substring(0, name.lastIndexOf('.'))
}
人们应该注意到这是写在我的上网本上,在微小的SO编辑器框中。此代码不适用于生产。它只是服务器作为我如何从文件名中删除扩展名的良好的第一次尝试示例。
答案 3 :(得分:2)
这实际上非常简单,假设你有一个有效的文件名。
在Windows文件名中,点字符仅用于指定扩展名。所以剥掉点和后面的任何东西。
在类似unix的文件名中,如果点在最后一个分隔符('/')之后并且在它和最后一个分隔符之间至少有一个字符(并且不是第一个字符,如果没有分隔符),则点表示扩展名。找到最后一个点,查看它是否满足条件,并删除它和任何尾随字符(如果它)。
在执行此操作之前验证文件名非常重要,因为此算法对invlaid文件名可能会执行一些意外操作并生成有效的文件名。因此,在Windows中,您可能需要检查点后面没有反斜杠或冒号。
如果你不知道你正在处理什么样的文件名,那么像Unix一样对待它们会让你大部分时间。
答案 4 :(得分:2)
int p=name.lastIndexOf('.');
if (p>0)
name=name.substring(0,p);
我说“p&gt; 0”而不是“p&gt; = 0”,因为如果第一个字符是句号,我们可能不想删除整个名称,就像在“.hidden”示例中一样。
您是否想要实际更新磁盘上的文件名,还是在谈论内部操作它?
答案 5 :(得分:1)
对于这些东西的正则表达式“足够快”但是与可以想到的最简单的方法相比效率不高:从末尾扫描字符串并在第一个点(不包括)处截断它。在Java中,您可以使用lastIndexOf和substring来仅获取您感兴趣的部分。初始点应视为特殊情况,如果最后一次出现“。”。在开头,应返回整个字符串。
答案 6 :(得分:1)
我知道一个正则表达式,但在Java中,我必须编写10行代码来进行简单的正则表达式替换吗?
使用和不使用隐藏文件:
^(.*)\..*$
^(..*)\..*$
答案 7 :(得分:1)
使用新的卸妆()。删除(字符串),
jdb@Vigor14:/tmp/stackoverflow> javac Remover.java && java Remover
folder > folder
hello.txt > hello
read.me > read
hello.bkp.txt > hello.bkp
weird..name > weird.
.hidden > .hidden
Remover.java,
import java.util.*;
public class Remover {
public static void main(String [] args){
Map<String, String> tests = new LinkedHashMap<String, String>();
tests.put("folder", "folder");
tests.put("hello.txt", "hello");
tests.put("read.me", "read");
tests.put("hello.bkp.txt", "hello.bkp");
tests.put("weird..name", "weird.");
tests.put(".hidden", ".hidden");
Remover r = new Remover();
for(String in: tests.keySet()){
String actual = r.remove(in);
log(in+" > " +actual);
String expected = tests.get(in);
if(!expected.equals(actual)){
throw new RuntimeException();
}
}
}
private static void log(String s){
System.out.println(s);
}
public String remove(String in){
if(in == null) {
return null;
}
int p = in.lastIndexOf(".");
if(p <= 0){
return in;
}
return in.substring(0, p);
}
}
答案 8 :(得分:0)
filename.replace("$(.+)\.\\w+", "\1");
答案 9 :(得分:0)
应重写上面的remove()
函数以支持LOST.DIR/myfile.txt
public static String removeExtension( String in )
{
int p = in.lastIndexOf(".");
if ( p < 0 )
return in;
int d = in.lastIndexOf( File.separator );
if ( d < 0 && p == 0 )
return in;
if ( d >= 0 && d > p )
return in;
return in.substring( 0, p );
}