在Java中,如何从字符串中删除文件扩展名?

196

在Java中,最有效的方式是什么来截取后缀,例如:

title part1.txt
title part2.html
=>
title part1
title part2

2
高效的代码是你所期望的,我希望没有与 CPU 相关的意思。 - mkoryak
3
他并不是在问如何去做,他在问什么是最有效率的方式。我也是来这里寻找同样的答案的。 - Edward Falk
23个回答

4

如果您使用Spring,您可以使用

org.springframework.util.StringUtils.stripFilenameExtension(String path)

将给定的Java资源路径中的文件扩展名去除,例如 "mypath/myfile.txt" -> "mypath/myfile"。 参数:path - 文件路径 返回值:去除了文件扩展名的路径。

感谢您的发布。由于某种原因,这些SO帖子总是不喜欢使用库,但我的项目已经有了Spring依赖项,这比自己编写更明确和清晰。 - Adam Hughes

4

使用正则表达式。这个正则表达式将替换最后一个点和它后面的所有内容。

String baseName = fileName.replaceAll("\\.[^.]*$", "");

如果您想预编译正则表达式,也可以创建一个Pattern对象。


2
 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }

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 "";
        }
    }

1

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 = '\\';

1
我能做到的最好的是尝试遵循Path类进行编写。
Path removeExtension(Path path) {
    return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}

1

不要给自己太大的压力,朋友们。我已经多次这样做了。只需将此公共静态方法复制粘贴到您的staticUtils库中以供将来使用即可 ;-)

static String removeExtension(String path){
        String filename;
        String foldrpath;
        String filenameWithoutExtension;
        if(path.equals("")){return "";}
        if(path.contains("\\")){    // direct substring method give wrong result for "a.b.c.d\e.f.g\supersu"
            filename = path.substring(path.lastIndexOf("\\"));
            foldrpath = path.substring(0, path.lastIndexOf('\\'));;
            if(filename.contains(".")){
                filenameWithoutExtension = filename.substring(0, filename.lastIndexOf('.'));
            }else{
                filenameWithoutExtension = filename;
            }
            return foldrpath + filenameWithoutExtension;
        }else{
            return path.substring(0, path.lastIndexOf('.'));
        }
    }

应该使用系统目录分隔符,而不是硬编码的反斜杠。 - Zastai

1
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");

需要使用 "\\." 进行分割,因为 "." 在正则表达式中是特殊字符。 - Compass

0

考虑到没有文件扩展名或有多个文件扩展名的情况

例如文件名:file | file.txt | file.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;
}

0
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();
}

这将输出example,用于imgimgLink


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接