我正在尝试获取没有其扩展名的File
对象的名称,例如文件名是“vegetation.txt”时得到“植被”。我试过实现这段代码:
openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];
不幸的是,它返回一个null
对象。我想,定义String
对象时会出现问题,因为方法getName()
正常工作;它给我带有扩展名的文件名。
你有什么想法吗?
答案 0 :(得分:40)
如果您想自己实现,请尝试以下方法:
String name = file.getName();
int pos = name.lastIndexOf(".");
if (pos > 0) {
name = name.substring(0, pos);
}
(此变体不会为输入文件名留下空字符串,例如“.txt”。如果您希望字符串在这种情况下为空,请将> 0
更改为>= 0
。 )
如果您认为它使代码更具可读性,您可以使用条件表达式将赋值替换为if
语句;比如@ Steven的回答。 (我认为不是......但这是一个意见问题。)
使用其他人编写和测试的实现可能是更好的主意。 Apache FilenameUtils
是一个不错的选择;请参阅@ slachnick的答案,以及链接的Q& A。
答案 1 :(得分:19)
如果您不想自己编写此代码,可以使用Apache的FilenameUtils。
FilenameUtils.getBaseName(openFile.getName());
这将返回文件名减去路径和扩展名。
答案 2 :(得分:5)
我更喜欢在“。”的最后一个索引之前砍掉。是文件名。 这样文件名:hello.test.txt就是hello.test
即。
int pos = filename.lastIndexOf(".");
String justName = pos > 0 ? filename.substring(0, pos) : filename;
你需要处理没有扩展名。
答案 3 :(得分:2)
您可以尝试split("\\.");
。也就是说,基本上转义.
,因为它被视为正则表达式中的所有字符。
答案 4 :(得分:2)
String#split采用正则表达式。 “”匹配任何字符,所以你得到一个空字符串数组 - 每对字符之间的每个字符一个。
http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)
答案 5 :(得分:2)
您的代码存在两个问题......
1)只需使用“。”作为分裂的论据被解释为你不想要的Rejex。你想要一个文字点。所以你必须逃脱它......
openFile.getName().split("\\.");
2)您将错误地解析具有多个点的任何文件。最好的方法是搜索最后一个点并获取子字符串......
int pos = openFile.getName().lastIndexOf(".");
if(pos != -1) {
String name = openFile.getName().substring(0, pos);
}