【发布时间】:2010-10-30 18:54:55
【问题描述】:
在Java中修剪后缀最有效的方法是什么,如下所示:
title part1.txt
title part2.html
=>
title part1
title part2
【问题讨论】:
-
高效的代码,是我希望的意思,而不是 CPU 方面
-
他不是在问怎么做,而是在问什么是最有效的方法。我来这里也是为了找同样的东西。
在Java中修剪后缀最有效的方法是什么,如下所示:
title part1.txt
title part2.html
=>
title part1
title part2
【问题讨论】:
这是我们不应该自己编写的代码。将图书馆用于平凡的东西,把你的大脑留给困难的东西。
在这种情况下,我建议使用来自Apache Commons IO 的FilenameUtils.removeExtension()
【讨论】:
str.substring(0, str.lastIndexOf('.'))
【讨论】:
if(str.contains(".")) str.substring(0, str.lastIndexOf('.'))
由于在单行中使用String.substring 和String.lastIndex 很好,但在处理某些文件路径方面存在一些问题。
以如下路径为例:
a.b/c
使用单行将导致:
a
这是不正确的。
结果应该是c,但由于文件缺少扩展名,但路径中有一个名称中带有. 的目录,单线方法被欺骗,将路径的一部分作为文件名,不正确。
需要检查
受skaffman's answer的启发,我看了一下Apache Commons IO的FilenameUtils.removeExtension方法。
为了重现它的行为,我编写了一些新方法应完成的测试,如下所示:
路径文件名 -------------- -------- a/b/c c a/b/c.jpg c a/b/c.jpg.jpg c.jpg a.b/c c a.b/c.jpg c a.b/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);
}
使用上述测试运行此removeExtension 方法会产生上面列出的结果。
该方法已使用以下代码进行了测试。由于这是在 Windows 上运行的,因此路径分隔符是 \,当用作 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("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\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
结果是方法应满足的测试中概述的预期结果。
【讨论】:
System.getProperty("file.separator") 而不仅仅是File.separator 有什么特别的原因吗?
/path/to/.htaccess会失败
顺便说一句,就我而言,当我想要一个快速解决方案来删除特定扩展时,这大约是我所做的:
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
我想不出一种更快的方式。
【讨论】:
你可以试试这个功能,很基础的
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
【讨论】:
如果您的项目已经依赖于 Google 核心库,请使用 com.google.common.io.Files 类中的方法。您需要的方法是getNameWithoutExtension。
【讨论】:
我发现coolbird's answer 特别有用。
但我将最后一个结果语句更改为:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
因为我希望返回完整的路径名。
所以“C:\Users\mroh004.COM\Documents\Test\Test.xml”变成 "C:\Users\mroh004.COM\Documents\Test\Test" 而不是 “测试”
【讨论】:
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
【讨论】:
使用正则表达式。这个替换了最后一个点,以及它之后的所有内容。
String baseName = fileName.replaceAll("\\.[^.]*$", "");
如果你想预编译正则表达式,你也可以创建一个 Pattern 对象。
【讨论】:
private String trimFileExtension(String fileName)
{
String[] splits = fileName.split( "\\." );
return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
}
【讨论】:
如果你使用 Spring,你可以使用
org.springframework.util.StringUtils.stripFilenameExtension(String path)
从给定的 Java 资源路径中去除文件扩展名,例如
“mypath/myfile.txt”->“mypath/myfile”。
Params: path – 文件路径
返回:去除文件扩展名的路径
【讨论】:
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
【讨论】:
"\\." 上拆分为“.”正则表达式专用。
使用字符串图像路径创建一个新文件
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 = '\\';
【讨论】:
我能写出的最好的东西试图坚持 Path 类:
Path removeExtension(Path path) {
return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}
【讨论】:
我会这样做:
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);
从头到尾直到 '.'然后调用子字符串。
编辑: 可能不是高尔夫球,但它很有效:)
【讨论】:
记住没有文件扩展名或有多个文件扩展名的场景
示例文件名:文件 |文件.txt |文件.tar.bz2
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
【讨论】:
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;
try {
uri = new URI(img);
String[] segments = uri.getPath().split("/");
System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
e.printStackTrace();
}
这将为 img 和 imgLink
输出 example【讨论】:
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}
【讨论】:
file.length() > 0 检查的目的是什么?
private String trimFileName(String fileName)
{
String[] ext;
ext = fileName.split("\\.");
return fileName.replace(ext[ext.length - 1], "");
}
此代码会将文件名溢出到它曾经有“.”的部分,例如。如果文件名是file-name.hello.txt,那么它将被拆分为字符串数组,{ "file-name", "hello", "txt" }。所以无论如何,这个字符串数组中的最后一个元素将是那个特定文件的文件扩展名,所以我们可以简单地用arrayname.length - 1找到任何数组的最后一个元素,所以在我们知道最后一个元素之后,我们可以替换该文件名中带有空字符串的文件扩展名。最后,这将返回 file-name.hello。 ,如果您还想删除最后一个句点,那么您可以将只有句点的字符串添加到返回行中字符串数组的最后一个元素。应该是这样的,
return fileName.replace("." + ext[ext.length - 1], "");
【讨论】: