【问题标题】:How do I trim a file extension from a String in Java?如何从 Java 中的字符串修剪文件扩展名?
【发布时间】:2010-10-30 18:54:55
【问题描述】:

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

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

【问题讨论】:

  • 高效的代码,是我希望的意思,而不是 CPU 方面
  • 他不是在问怎么做,而是在问什么是最有效的方法。我来这里也是为了找同样的东西。

标签: java string process


【解决方案1】:

这是我们不应该自己编写的代码。将图书馆用于平凡的东西,把你的大脑留给困难的东西。

在这种情况下,我建议使用来自Apache Commons IOFilenameUtils.removeExtension()

【讨论】:

  • 对于 95% 的项目,这应该是公认的答案。像这样重写代码是许多令人头疼的根本原因!
  • 只需在 gradle 中添加以下行来添加依赖:- compile 'commons-io:commons-io:2.6'
  • 如果您的项目中已经有 Apache Commons I/O,那就对了。但是,如果这一切都是您所需要的,那么您将(至少)为您的项目增加 2.5 MB 的自重,以实现可以通过一行轻松完成的事情。
【解决方案2】:
str.substring(0, str.lastIndexOf('.'))

【讨论】:

  • 这应该分配给一个新的变量,因为 str 没有被修改。
  • 小心处理:如果文件名没有后缀,它会向你抛出异常。
  • archive.tar.bz2 怎么样?
  • if(str.contains(".")) str.substring(0, str.lastIndexOf('.'))
  • if(str != null && str.contains(".")) str.substring(0, str.lastIndexOf('.'))。 FilenameUtils 是另一个依赖项,并不总是可用
【解决方案3】:

由于在单行中使用String.substringString.lastIndex 很好,但在处理某些文件路径方面存在一些问题。

以如下路径为例:

a.b/c

使用单行将导致:

a

这是不正确的。

结果应该是c,但由于文件缺少扩展名,但路径中有一个名称中带有. 的目录,单线方法被欺骗,将路径的一部分作为文件名,不正确。

需要检查

skaffman's answer的启发,我看了一下Apache Commons IOFilenameUtils.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 有什么特别的原因吗?
  • 一句警告:此解决方案还删除了前面的路径,而不仅仅是扩展名,这与 Apache Commons IO 方法不同。
  • 看来/path/to/.htaccess会失败
【解决方案4】:

顺便说一句,就我而言,当我想要一个快速解决方案来删除特定扩展时,这大约是我所做的:

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

【讨论】:

    【解决方案5】:
    String foo = "title part1.txt";
    foo = foo.substring(0, foo.lastIndexOf('.'));
    

    【讨论】:

    • 不,可能不止一个'.';你想要 lastIndexOf('.')
    • -1 因为没有使用我认为您正在使用的方法。现在我总共给了+0。快换! ;)
    【解决方案6】:
    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

    我想不出一种更快的方式。

    【讨论】:

      【解决方案7】:

      你可以试试这个功能,很基础的

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

        【解决方案9】:

        我发现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" 而不是
           “测试”
        

        【讨论】:

          【解决方案10】:
          filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
          

          【讨论】:

          • 与所要求的相反,无需传递长度,只需使用一个 arg 子字符串
          【解决方案11】:

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

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

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

          【讨论】:

            【解决方案12】:
             private String trimFileExtension(String fileName)
              {
                 String[] splits = fileName.split( "\\." );
                 return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
              }
            

            【讨论】:

              【解决方案13】:

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

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

              从给定的 Java 资源路径中去除文件扩展名,例如

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

              Params: path – 文件路径

              返回:去除文件扩展名的路径

              【讨论】:

              • 感谢您的发帖。出于某种原因,这些 SO 帖子总是不喜欢使用库,但是我的项目已经有了 spring 依赖,这比我自己写的更明确和干净
              【解决方案14】:
              String[] splitted = fileName.split(".");
              String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
              

              【讨论】:

              • 需要在"\\." 上拆分为“.”正则表达式专用。
              【解决方案15】:

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

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

              【讨论】:

                【解决方案16】:

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

                【讨论】:

                  【解决方案17】:

                  我能写出的最好的东西试图坚持 Path 类:

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

                  【讨论】:

                    【解决方案18】:

                    我会这样做:

                    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);
                    

                    从头到尾直到 '.'然后调用子字符串。

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

                    【讨论】:

                    • 这基本上就是 lastIndexOf 所做的;为什么要重新发明轮子?
                    • 为了好玩,有点描述性。只是。 (我在写这篇文章时忘记了 lastIndexOf)
                    【解决方案19】:

                    记住没有文件扩展名或有多个文件扩展名的场景

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

                    【讨论】:

                      【解决方案20】:
                      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();
                      }
                      

                      这将为 imgimgLink

                      输出 example

                      【讨论】:

                        【解决方案21】:
                        public static String removeExtension(String file) {
                            if(file != null && file.length() > 0) {
                                while(file.contains(".")) {
                                    file = file.substring(0, file.lastIndexOf('.'));
                                }
                            }
                            return file;
                        }
                        

                        【讨论】:

                        • 这会将“a.jpg.jpg”转换为“a”,而不是(正确的)“a.jpg”。 file.length() > 0 检查的目的是什么?
                        • 主要问题是“如何删除扩展名?”,所以是的,它将“a.txt.zip”转换为“a”,将“.htaccess”转换为空。此函数适用于字符串,因此文件名不能为空,但长度仍可以为 0,在解析符号之前更快地检查是否值得。问候。
                        【解决方案22】:
                        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], "");
                        

                        【讨论】:

                        • 几句话解释一下这段代码应该如何提供帮助会非常有用
                        猜你喜欢
                        • 2011-05-14
                        • 2013-04-10
                        • 1970-01-01
                        • 2015-10-20
                        • 2017-01-21
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-08-27
                        相关资源
                        最近更新 更多