2014-01-06 21 views
1

我從JTextArea這樣的文字:儲蓄從一定JTextArea的文本文件中使用的JFileChooser

Getting all .mp3 files in C:\Users\Admin\Music including those in subdirectories 

C:\Users\Admin\Music\Sample Music\Kalimba.mp3 
C:\Users\Admin\Music\Sample Music\Maid with the Flaxen Hair.mp3 
C:\Users\Admin\Music\Sample Music\Sleep Away.mp3 

Finished Searching... 

我想只保存這部分:

C:\Users\Admin\Music\Sample Music\Kalimba.mp3 
C:\Users\Admin\Music\Sample Music\Maid with the Flaxen Hair.mp3 
C:\Users\Admin\Music\Sample Music\Sleep Away.mp3 

可惜我不能用下面的代碼:

JFileChooser saveFile = new JFileChooser("./"); 
int returnVal = saveFile.showSaveDialog(this); 
File file = saveFile.getSelectedFile(); 
BufferedWriter writer = null; 
if (returnVal == JFileChooser.APPROVE_OPTION) 
{ 
    try { 
    writer = new BufferedWriter(new FileWriter(file.getAbsolutePath()+".txt")); // txt for now but needs to be m3u 
    searchMP3Results.write(writer); // using JTextArea built-in writer 
    writer.close(); 
    JOptionPane.showMessageDialog(this, "Search results have been saved!", 
       "Success", JOptionPane.INFORMATION_MESSAGE); 
    } 
    catch (IOException e) { 
    JOptionPane.showMessageDialog(this, "An error has occured", 
       "Failed", JOptionPane.INFORMATION_MESSAGE); 
    } 
} 

通過上面的代碼,這樣可以節省一切從JTextArea。你可以幫我嗎?

P.S.如果可能,我想將它保存爲M3U播放列表。

+0

我建議在C:\ Users \ Admin \ Music中包含'JLabel'中的所有.mp3文件,包括子目錄中的所有.mp3文件。但請注意,文件列表不是M3U文件(AFAIU)。您可能有足夠的軟件將文件列表視爲M3U文件,但這並不是一個有效的M3U文件。例如。一個M3U文件必須以'#EXTM3U'的第一行開始,而像'#EXTINF:270,10CC - Dreadlock Holiday'這樣的行是可選的,但非常有用。 –

+0

我可以只使用indexOf()來獲得某些部分,然後手動添加其餘部分,即#EXTINF等? – Darwish

+0

那麼,除非使用'Writer',否則當然你不會使用第二個不可見的文本區域,將M3U格式的數據轉儲到它,然後用它來寫入數據。順便說一句 - 我依稀記得一個M3U應該是一個特定的編碼。確保'FileWriter'解決了這個問題。 –

回答

0

我假設searchMP3Results是包含文本的JTextArea。在這種情況下,您可以使用searchMP3Results.getText()將文本作爲String,然後通過正則表達式查找文件路徑來運行結果。 Windows路徑的正則表達式就是這個問題java regular expression to match file path。不幸的是,這將你的應用程序綁定到Windows,但如果這是可以接受的,那麼你很好,否則你應該使用系統屬性檢測操作系統,並選擇正確的正則表達式。

只要m3u你應該能夠導出目錄路徑(每行一個)。擴展的m3u文件(使用標頭#EXTM3U)需要額外的信息,但您應該能夠脫離簡單版本。

更新:添加代碼 更新2:更改正則表達式來路徑正則表達式(副文件)的修改版本,現在運行它針對每一行,而不是執行多行評估

String text = searchMP3Results.getText(); 
StringBuilder output = new StringBuilder(); 
for (String s : text.split("\n")) { 
    if (java.util.regex.Pattern.matches("^([a-zA-Z]:)?(\\\\[\\s\\.a-zA-Z0-9_-]+)+\\\\?$", s)) { 
     output.append(s).append("\n"); 
    } 
} 

的該代碼將輸入到行數組中(您可能想使用\r\n而不是\n),然後使用正則表達式來檢查該行是否是路徑/文件名組合。不會執行進一步的檢查,並且假定路徑/文件名是有效的,因爲它可能來自外部應用程序。我的意思是,正則表達式不會檢查路徑/文件名中的無效字符,也不會檢查文件是否存在,儘管這樣做很容易添加。

+0

是的,searchMP3Results是JTextArea。無論如何,你可以給我一個m3u部分的示例代碼,謝謝。 – Darwish

+0

添加代碼。只需將'output.toString()'的內容寫入m3u即可。 – disrvptor

+0

該文件爲空 – Darwish