2011-12-06 82 views
17

我試圖獲取沒有擴展名的File對象的名稱,例如當文件名爲「vegetation.txt」時獲得「植被」。我試圖執行此代碼:如何在沒有Java擴展的情況下獲取File對象的名稱?

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

不幸的是,它返回一個null對象。我認爲在定義String對象時存在一個問題,因爲方法getName()正常工作;它給我帶有擴展名的文件的名稱。

你有什麼想法嗎?

回答

36

如果你想這個自己實現,試試這個:

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

(這種變化沒有按」 t讓你像「.TXT」輸入文件名空字符串。如果你希望字符串是在這種情況下空,改變> 0>= 0。)


你可以更換if語句使用條件表達式進行賦值,如果您認爲它使您的代碼更具可讀性;例如,請參閱@史蒂文的回答。 (我不認爲它...但它是見仁見智。)


這無疑是一個更好的主意,使用別人已經編寫並測試的實現。 Apache FilenameUtils是個不錯的選擇;請參閱@ slachnick的答案以及鏈接Q & A.

+0

非常感謝您解決我的問題:) – MichalB

4

我寧願在最後一個索引「。」之前砍掉。成爲文件名。 這樣一個文件名:hello.test.txt只是hello.test中

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

您需要處理那裏是沒有擴展名了。

2

您可以試試split("\\.");。也就是說,基本上逃避.,因爲它被視爲正則表達式中的所有字符。

2

有兩個問題與您的代碼...

1)剛開始使用 「」作爲分裂的論據被解釋爲你不想要的Rejex。你想要一個字面點。所以你必須逃避它...

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

2)你會錯誤地解析任何文件與多個點。要做到這一點,最好的辦法是尋找最後一個點,並獲得子...

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

如果您不想自己編寫此代碼,則可以使用Apache的FilenameUtils

FilenameUtils.getBaseName(openFile.getName()); 

這將返回文件名減去路徑和擴展名。

相關問題