如何从Java中的string修剪文件扩展名?
在Java中修改后缀的最有效的方法是什么?
title part1.txt title part2.html => title part1 title part2
这是我们不应该自己做的那种代码。 使用图书馆为世俗的东西,保存你的大脑的困难的东西。
在这种情况下,我build议使用Apache Commons IO中的 FilenameUtils.removeExtension()
str.substring(0, str.lastIndexOf('.'))
由于在一行中使用String.substring
和String.lastIndex
是很好的,所以在处理某些文件path方面存在一些问题。
以下面的path为例:
ab/c
使用单行将导致:
a
这是不正确的。
结果应该是c
,但由于文件缺less扩展名,但path中有一个目录.
在这个名字里面,单线程的方法被欺骗,把path的一部分作为文件名,这是不正确的。
需要检查
受到skaffman的回答的启发,我看了一下Apache Commons IO的FilenameUtils.removeExtension
方法。
为了重现它的行为,我写了一些新的方法应该实现的testing,它们是:
path文件名 -------------- -------- 的a / b / cc的 a / b / c.jpg c a / b / c.jpg.jpg c.jpg AB / cc的 ab / c.jpg c ab / c.jpg.jpg c.jpg CC c.jpg c c.jpg.jpg c.jpg
(这就是我所检查的一切 – 可能还有其他检查应该到位,我忽略了。)
执行
以下是我的removeExtension
方法的实现:
public static String removeExtension(String s) { String separator = System.getProperty("file.separator"); String filename; // Remove the path upto the filename. int lastSeparatorIndex = s.lastIndexOf(separator); if (lastSeparatorIndex == -1) { filename = s; } else { filename = s.substring(lastSeparatorIndex + 1); } // Remove the extension. int extensionIndex = filename.lastIndexOf("."); if (extensionIndex == -1) return filename; return filename.substring(0, extensionIndex); }
用上面的testing运行这个removeExtension
方法将得到上面列出的结果。
该方法用以下代码进行testing。 由于这是在Windows上运行的,path分隔符是一个\
,当用作String
文字的一部分时,它必须用\
转义。
System.out.println(removeExtension("a\\b\\c")); System.out.println(removeExtension("a\\b\\c.jpg")); System.out.println(removeExtension("a\\b\\c.jpg.jpg")); System.out.println(removeExtension("ab\\c")); System.out.println(removeExtension("ab\\c.jpg")); System.out.println(removeExtension("ab\\c.jpg.jpg")); System.out.println(removeExtension("c")); System.out.println(removeExtension("c.jpg")); System.out.println(removeExtension("c.jpg.jpg"));
结果是:
c c c.jpg c c c.jpg c c c.jpg
结果是在方法应该满足的testing中列出的期望的结果。
顺便说一句,在我的情况下,当我想要一个快速的解决scheme,删除一个特定的扩展,这大概是我所做的:
if (filename.endsWith(ext)) return filename.substring(0,filename.length() - ext.length()); else return filename;
String foo = "title part1.txt"; foo = foo.substring(0, foo.lastIndexOf('.'));
String fileName="foo.bar"; int dotIndex=fileName.lastIndexOf('.'); if(dotIndex>=0) { // to prevent exception if there is no dot fileName=fileName.substring(0,dotIndex); }
这是一个诡计的问题吗? :p
我想不到更快的方式。
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
我发现coolbird的答案特别有用。
但是我把最后的结果语句改为:
if (extensionIndex == -1) return s; return s.substring(0, lastSeparatorIndex+1) + filename.substring(0, extensionIndex);
因为我想要返回完整的path名称。
因此“C:\ Users \ mroh004.COM \ Documents \ Test \ Test.xml”变成了 “C:\ Users \ mroh004.COM \ Documents \ Test \ Test”而不是 “testing”
String[] splitted = fileName.split("."); String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
用string图像path创build一个新的文件
String imagePath; File test = new File(imagePath); test.getName(); test.getPath(); getExtension(test.getName()); public static String getExtension(String uri) { if (uri == null) { return null; } int dot = uri.lastIndexOf("."); if (dot >= 0) { return uri.substring(dot); } else { // No extension. return ""; } }
org.apache.commons.io.FilenameUtils 2.4版给出了以下答案
public static String removeExtension(String filename) { if (filename == null) { return null; } int index = indexOfExtension(filename); if (index == -1) { return filename; } else { return filename.substring(0, index); } } 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; } 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); } public static final char EXTENSION_SEPARATOR = '.'; private static final char UNIX_SEPARATOR = '/'; private static final char WINDOWS_SEPARATOR = '\\';
private String trimFileExtension(String fileName) { String[] splits = fileName.split( "\\." ); return StringUtils.remove( fileName, "." + splits[splits.length - 1] ); }
我会这样做:
String title_part = "title part1.txt"; int i; for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--); title_part = title_part.substring(0,i);
从开始到结束直到'。' 然后调用子串。
编辑:可能不是一个高尔夫,但它是有效的:)
使用正则expression式。 这个取代了最后一个点,以及之后的所有内容。
String baseName = fileName.replaceAll("\\.[^.]*$", "");
如果要预编译正则expression式,也可以创build一个Pattern对象。