在Java中检查文件扩展名

29
我需要从Excel文件中导入数据到数据库,为此,我想检查所选文件的扩展名。
这是我的代码:
String filename = file.getName();
String extension = filename.substring(filename.lastIndexOf(".") + 1, filename.length());

String excel = "xls";
if (extension != excel) {
    JOptionPane.showMessageDialog(null, "Choose an excel file!");
}
else {
    String filepath = file.getAbsolutePath();
    JOptionPane.showMessageDialog(null, filepath);
    String upload = UploadPoData.initialize(null, filepath);

    if (upload == "OK") {
        JOptionPane.showMessageDialog(null, "Upload Successful!");
    }
}

但我总是得到:

选择一个Excel文件!

我无法找出我的代码有什么问题,请有人帮忙。


extension变量得到什么值?有关字符串比较的好问题:https://dev59.com/DnRB5IYBdhLWcg3wyqEd - maksimov
3
作为一个经验法则,当你想要忽略大小写比较两个字符串是否相等时,请使用equalsIgnoreCase()方法。 - posdef
1
哎呀!当遇到没有点号的文件名时,这段代码将会抛出一个“StringIndexOutOfBoundsException”异常。 - arkon
愚蠢的代码使用!=比较字符串,但无论如何文件扩展名检查代码都有帮助。 - shaunak1111
8个回答

28

以下

extension != excel
应该是这样的。
!excel.equals(extension)
或者
!excel.equalsIgnoreCase(extension)

另请参阅


7
实际上应该是 !excel.equalsCaseIgnore(extension) ;) - Peter Lawrey
@peter 是的,我在答案中添加了它。 - jmj
2
啊哈,彼得,陷阱设计得好,小心翼翼地放置。实际上应该使用“equalsIgnoreCase()”,而不是“equalsCaseIgnore”。@JigarJoshi 不,不是“或equalsIgnoreCase”,它实际上应该是 equalsIgnoreCase 而不是 equals - maksimov

7

==测试引用相等性,如果要进行值相等性测试,请使用.equals。如果您希望在相等性测试期间忽略大小写,请使用String#equalsIgnoreCase

另外一件事:不要重复发明轮子,除非它已经严重损坏。在您的情况下,您应该使用Apache Commons的FilenameUtils#isExtension来检查扩展名。


他可能因为某种原因需要减少依赖项,但他想做的事情非常简单,我实际上不建议仅为此添加依赖项。 - posdef
@posdef,没错。他至少应该将其分解为一个单独的方法。 - missingfaktor
顺便说一下,如果你查看FilenameUtils#isExtension的源代码,你会发现这个任务并不像看起来那么简单。 - missingfaktor
承认的是,即使是最简单的任务,在你开始寻找覆盖所有可能选项的通用解决方案时也会变得复杂。但这并不意味着 OP 需要一个如此复杂的解决方案。 :) - posdef
@posdef 除非他想要让它防弹。在这种情况下,他肯定需要一个复杂的解决方案。 - arkon

6
if (extension != excel){
   JOptionPane.showMessageDialog(null, "Choose an excel file!");

}

应该作为何种用途使用

if (!extension.equals(excel)){
   JOptionPane.showMessageDialog(null, "Choose an excel file!");

}

同时

 if (upload == "OK") {
 JOptionPane.showMessageDialog(null,"Upload Successful!");
}

as

 if ("OK".equals(upload)) {
 JOptionPane.showMessageDialog(null,"Upload Successful!");
}

你真的想在常量上执行 equals,而不是在变量上执行,因为你的变量可能为 null。所以 "OK".equalsIgnoreCase(upload) 总是比另一种方式更好。 - maksimov
谢谢,但是你的更新并没有改善我之前提到的问题。 - maksimov

3

使用

excel.equals(extension)

or

excel.equalsIgnoreCase(extension)

3

2
在我的程序中,我做了这个。
if(file_name.endsWith(".xls") || file_name.endsWith(".xlsx"))
   // something works with file

请提供更多细节。 - ppasler
我的示例展示了检查文件扩展名的简单方法。我的意思是,您需要获取文件名并检查该字符串末尾是否有所需的符号。 - Vitaly Vlasov

1

在您的情况下,请使用equals()方法而不是!=符号。我的意思是写成:

if (!(extension.equals(excel))){..........}

谢谢你。 我对Java还有点陌生,你能给我解释一下吗? 我使用e.getActionCommand() == "ApproveSelection"来检查FileChooser中是否点击了打开按钮,它有效了。 这有什么区别吗? - Joe88
@Joe88 简而言之,== 检查的是引用,而 equals() 检查的是内容。你可以在这个概念上找到很多文章。所以去谷歌搜索了解更多信息吧。 - Chandra Sekhar
@Joe88 一般来说,对于JVM,“ApproveSelection”是一个常量,因此使用相同“ApproveSelection”构建的ActionCommand将在内部指向相同的内存。 - maksimov

0

怎么样?

if (filename.endsWith("xls"){
    <blah blah blah>
}

?


这会匹配我的名为 fooxls 的文件吗?foo.barxls 呢? - William Price

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