【问题标题】:How to get name of File object without its extension in Java? [duplicate]java - 如何在Java中获取没有扩展名的文件对象的名称? [复制]
【发布时间】:2012-01-13 16:43:58
【问题描述】:

我正在尝试获取不带扩展名的 File 对象的名称,例如当文件名是“vegetation.txt”时得到“vegetation”。我已尝试实现此代码:

openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];

不幸的是,它返回一个null 对象。我猜在定义String 对象时存在问题,因为getName() 方法工作正常;它给了我带有扩展名的文件名。

你有什么想法吗?

【问题讨论】:

    标签: java string file split


    【解决方案1】:

    如果你想自己实现,试试这个:

    String name = file.getName();
    int pos = name.lastIndexOf(".");
    if (pos > 0) {
        name = name.substring(0, pos);
    }
    

    (此变体不会为“.txt”之类的输入文件名留下空字符串。如果在这种情况下您希望字符串为空,请将> 0 更改为>= 0。)


    您可以使用条件表达式将if 语句替换为赋值语句,如果您认为这会使您的代码更具可读性;例如,请参阅@Steven 的答案。 (我不认为是这样......但这是一个见仁见智的问题。)


    使用其他人编写和测试过的实现可以说是一个更好的主意。 ApacheFilenameUtils 是一个不错的选择;请参阅@slachnick 的回答,以及链接的问答。

    【讨论】:

      【解决方案2】:

      如果您不想自己编写此代码,可以使用 Apache 的 FilenameUtils

      FilenameUtils.getBaseName(openFile.getName());
      

      这将返回文件名减去路径和扩展名。

      【讨论】:

        【解决方案3】:

        我更喜欢在“。”的最后一个索引之前切断。成为文件名。 这样一个文件名:hello.test.txt 就是 hello.test

        int pos = filename.lastIndexOf(".");
        String justName = pos > 0 ? filename.substring(0, pos) : filename;
        

        你也需要处理没有扩展名。

        【讨论】:

          【解决方案4】:

          你的代码有两个问题...

          1) 只使用“。”作为 split 的参数被解释为您不想要的拒绝。你想要一个文字点。所以你必须逃避它......

          openFile.getName().split("\\.");
          

          2) 您将错误地解析任何包含多个点的文件。最好的方法是搜索最后一个点并获取子字符串...

          int pos = openFile.getName().lastIndexOf(".");
          if(pos != -1) {
             String name = openFile.getName().substring(0, pos);
          }
          

          【讨论】:

          • 这应该是这个问题的最佳答案。
          • 如果文件名包含点则不起作用:some.a-b.here.txt
          【解决方案5】:

          String#split 采用正则表达式。 “。”匹配任何字符,因此您会得到一个空字符串数组 - 每对字符之间的每个位置都有一个空字符串。

          http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

          【讨论】:

            【解决方案6】:

            你可以试试split("\\.");。也就是说,基本上转义了.,因为它被视为正则表达式中的所有字符。

            【讨论】:

            • 如果文件名包含点则不起作用:some.a-b.here.txt
            猜你喜欢
            • 2010-10-29
            • 1970-01-01
            • 1970-01-01
            • 2012-09-12
            • 2011-04-04
            • 1970-01-01
            • 1970-01-01
            • 2015-02-14
            相关资源
            最近更新 更多