如何获取没有Java扩展名的File对象的名称?

我试图获取没有扩展名的File对象的名称,例如当文件名为“vegetation.txt”时获取“植被”。 我试过实现这段代码:

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

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

你有什么主意吗?

如果您想自己实现,请尝试以下方法:

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

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


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


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

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

 FilenameUtils.getBaseName(openFile.getName()); 

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

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

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

你需要处理没有扩展。

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

String#split采用正则表达式。 “” 匹配任何字符,所以你得到一个空字符串数组 – 每对字符之间的每个字符一个。

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

你的代码有两个问题……

1)只需使用“。” 作为分裂的论据被解释为你不想要的Rejex。 你想要一个文字点。 所以你必须逃脱它……

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

2)您将错误地解析具有多个点的任何文件。 执行此操作的最佳方法是搜索最后一个点并获取子字符串…

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