2013-08-26 32 views
2

我正在爲Java FX編寫音樂播放器的代碼,我使用MediaPlayer類,該類由Media類初始化。到目前爲止,我認爲,對於媒體的構造來源必須是字符串URI,所以我writen這段代碼添加的歌曲文件列表到播放列表等播放列表等:從Java FX的File類中的文件生成URI?

public void setPlaylist (List<File> lista) { 

    songsList.clear(); 
    for (File s : lista) { 
     songsList.add(s.toURI()); 
    } 
} 

這工作正常。然而,當我想要得到包含文件夾的路徑,並輸入查詢的URI格式,我得到了一些麻煩每個文件的名稱的文件,這是我到目前爲止已經試過:

public void setPlaylist (File folder) { 

    songsList.clear(); 
    for (String s : folder.list()) { 
     try { 
      songsList.add(new URI("file:///" + (folder + "\\" + s).replace("\\", "/").replaceAll(" ", "%20"))); 
     } catch (URISyntaxException ex) { 
      Logger.getLogger(PlayList.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

我越來越錯誤日誌這樣的:

重度:空java.net.URISyntaxException:在路徑非法字符在 索引78: 文件:/// C:/用戶/迭%20Aguilar /音樂/ 3%20Grandes% 20de%20la%20Banda/AlbumArt_ {9AEABE24-F5A2-441C-A71A-D061E000A9BA} _Large.jpg

+0

u能更多地討論了故障部位? –

+0

檢查我的更新,@JunedAhsan – diegoaguilar

回答

1

使用之前使用的File#toURI()可避免遇到編碼問題,並利用FilenameFilter將列表僅限制爲媒體文件。這是代碼的外觀。

public void setPlaylist (File folder) { 
    songsList.clear(); 
    File[] musicFiles = folder.listFiles(new FilenameFilter() { 

     @Override 
     public boolean accept(File dir, String name) { 
      return (name.endsWith(".mp3") || name.endsWith(".m4a")); 
     } 
    }); 
    for (File file : musicFiles) { 
     songsList.add(file.toURI()); 
    } 
} 

請參閱Javadocs:FilenameFilterFile#toURI()

+0

然後我會使用接受方法? – diegoaguilar

+1

您將'FilenameFilter'傳遞給'listFiles()',它將在內部調用'accept()'本身。您只需提供實現,並且File API將自動進行回調。 –

0

您的文件URI包含一個角括號{,這是造成SEVERE: null java.net.URISyntaxException

您需要有一個有效的文件路徑來創建一個適當的URI。

以下是指向URI RFC的鏈接,用於引用URL中允許的內容和不允許的內容。

1

而不是使用String s : folder.list()使用File s : folder.listFiles() ...然後使用文件中的URL。

+0

如何通過忽略它的字符串值以'。*'結尾來獲取每個文件的擴展名? – diegoaguilar

+0

通常的做法是在listFiles(filter ...)上使用Filter,Filter將告訴你被檢查的文件。查看http://docs.oracle.com/javase/6/docs/api/java/io/FileFilter.html並在文件被Filter接受時使用'File.getName()'上的某些邏輯,接受具有正確擴展名的文件。 – rolfl