Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何从字符串中修剪文件扩展名?_Java_String_Process - Fatal编程技术网

在Java中如何从字符串中修剪文件扩展名?

在Java中如何从字符串中修剪文件扩展名?,java,string,process,Java,String,Process,在Java中修剪后缀最有效的方法是什么,如下所示: title part1.txt title part2.html => title part1 title part2 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.substri

在Java中修剪后缀最有效的方法是什么,如下所示:

title part1.txt
title part2.html
=>
title part1
title part2
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);
我想这样做:

title part1.txt
title part2.html
=>
title part1
title part2
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);
从结尾到“.”然后调用子字符串

编辑: 可能不是高尔夫,但很有效:)

这是个骗人的问题吗p


我想不出比atm更快的方法。

这是我们不应该自己编写的代码。用图书馆来处理日常琐事,把你的大脑用来处理困难的事情


在这种情况下,我建议使用from

,因为在一行中使用
String.substring
String.lastIndex
很好,在处理某些文件路径方面存在一些问题

以以下路径为例:

a.b/c
使用一个衬里将导致:

a
那是不对的

结果应该是
c
,但由于文件缺少扩展名,但路径有一个名为
的目录,因此单行程序方法被欺骗,将路径的一部分作为文件名,这是不正确的

需要检查

受此启发,我看了一下这个方法

为了重新创建其行为,我编写了一些新方法应该完成的测试,如下所示:

Path Filename -------------- -------- 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 c c c.jpg c c.jpg.jpg c.jpg 使用上述测试运行此
removeExtension
方法将产生上面列出的结果

使用以下代码对该方法进行了测试。由于这是在Windows上运行的,因此路径分隔符是
\
,当用作
字符串的一部分时,必须使用
\
对其进行转义

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
结果是该方法应达到的测试中概述的预期结果。

我发现特别有用

但我将最后的结果声明更改为:

if (extensionIndex == -1)
  return s;

return s.substring(0, lastSeparatorIndex+1) 
         + filename.substring(0, extensionIndex);
因为我希望返回完整的路径名

So "C:\Users\mroh004.COM\Documents\Test\Test.xml" becomes "C:\Users\mroh004.COM\Documents\Test\Test" and not "Test" 所以“C:\Users\mroh004.COM\Documents\Test\Test.xml”变成 “C:\Users\mroh004.COM\Documents\Test\Test”而不是 “测试”
顺便说一句,在我的例子中,当我想要一个快速的解决方案来删除一个特定的扩展时,我大概就是这么做的:

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;

使用字符串图像路径创建新文件

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

使用正则表达式。这一个替换了最后一个点,以及它之后的所有内容

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

如果要预编译正则表达式,还可以创建模式对象。

请记住没有文件扩展名或有多个文件扩展名的情况

文件名示例: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;
}

如果您的项目已经依赖于google核心库,请使用
com.google.common.io.Files
类中的方法。您需要的方法是
getNameWithoutExtension

您可以尝试此功能,非常基本

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}

这将为imgimgLink输出示例,如果您使用Spring,您可以使用

public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}
org.springframework.util.StringUtils.stripFilenameExtension(String path)
从给定的Java资源路径中删除文件扩展名,例如

“mypath/myfile.txt”->“mypath/myfile”

Params:path–文件路径

返回:扩展名为stripped的路径


我能写的最好的东西就是坚持使用Path类:

Path removeExtension(Path path) {
    return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}


高效的代码智慧,是你的意思,我希望不是CPU智慧他不是问如何做,他是问什么是最有效的方式。我来这里也是为了同样的事情。这就是lastIndexOf所做的;为什么要重新发明轮子?为了好玩,也为了有点描述性。就这样。(我写这篇文章的时候忘记了lastIndexOf)不,可能不止一个';您需要lastIndexOf('.')-1,因为没有使用我以为您正在使用的方法。现在我的总积分是+0。快换这应该分配给一个新变量,因为str没有被修改。小心处理:如果文件名没有后缀,它会向您抛出一个异常。archive.tar.bz2呢?
if(str.contains(“.”)
str.substring(0,str.lastIndexOf(“.”)
if(str!=null&&str.contains(“.”)str.substring(0,str.lastIndexOf(“))。FilenameUtils是另一个依赖项,并不总是在应答时可用。使用
System.getProperty(“file.separator”)
而不仅仅是
file.separator
有什么特别的原因吗?警告一句:此解决方案还删除了前面的路径,而不仅仅是扩展名,与Apache Commons IO方法不同。对于与要求相反的
/path/to/.htaccess
来说,这可能会失败,并且不需要传递长度,只需使用一个arg substringNeed to split on
“\\”。“
as.”是正则表达式的特殊选项。对于95%的项目,这应该是可接受的答案。像这样重写代码是许多头痛的根本原因!只需在gradle中添加以下行以添加依赖性:-编译'commons io:commons io:2.6',如果您的项目中已经有了Apache commons I/O,那就对了。但是,如果这就是你所需要的,那么你正在为你的项目添加(至少)2.5 MB的静重,这可以用一行代码轻松完成。为什么有人反对我的答案?请注意,这只返回基本名称,因此路径也被删除:这将把“a.jpg.jpg”转换为“a”,而不是(正确的)“a.jpg”。检查
file.length()>0
的目的是什么?主要问题是“如何删除扩展名?”,因此,是的,它将“a.txt.zip”转换为“a”并将“.htaccess”转换为空。此函数用于字符串,因此文件名不能为null,但长度仍然可以为0,在解析符号之前更快地检查是否值得。当做
/**
 *
 * @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;
}
public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
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();
}
public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}
org.springframework.util.StringUtils.stripFilenameExtension(String path)
Path removeExtension(Path path) {
    return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}