【标题里之所以特意说明Windows,是因为文件路径中的分隔符,在linux下是'/',而在windows下是'\';我比较懒,直接在程序里写死了,所以有需要的可以自己改啦;另外的话,支持的文件格式种类也可以自己加,很容易~】
把以前别人写过的“读取某一目录下所有文件名”的程序改了改,用来随机播放音乐——自己的Music文件夹下有很多按歌手来分类的子文件夹,一直很想把这些歌混到一起shuffle播放。
一开始想做成Windows Media Player特有的wpl文件;用文本编辑器打开看了看,其实.wpl也就是个XML文件,然后我依葫芦画瓢,也照写了一个,下面是值得注意的几个点:
1. dos文件和unix文件有区别,具体看这里http://blog.chinaunix.net/uid-22548820-id-2942782.html;
保险起见,我用vim的set fileformat=dos命令将文件改成了dos格式。
但最后事实证明,unix格式的文件WMP也能播放。
2. wpl文件中,有的歌曲名后会跟有tid="xxxxxxx"这样子的东西,我把它们删掉以后不构成影响,所以也不用去管它。
3.我也担心过文件编码问题,但其实编码也不构成大影响——唯一的影响就是,在WMP的列表窗口中,如果是ANSI编码的wpl文件,中文歌的歌名会是乱码;但如果用记事本保存成UTF-8就正常了。
参考资料1:
http://zz563143188.iteye.com/blog/1851893
参考资料2:
http://www.imkevinyang.com/2009/02/%E5%AD%97%E7%AC%A6%E7%BC%96%E8%A7%A3%E7%A0%81%E7%9A%84%E6%95%85%E4%BA%8B%EF%BC%88ascii%EF%BC%8Cansi%EF%BC%8Cunicode%EF%BC%8Cutf-8%E5%8C%BA%E5%88%AB%EF%BC%89.html
4.wpl中,有一行指定了列表中item的数量——其实这个根本没用,我本以为我失败的原因是在于它。
5.最后就是——wpl文件没有被WMP成功识别;原因我也没能找到。事实上,如果一个文件夹下没有子文件夹,则程序生成的wpl文件能被WMP识别;但一有子文件夹,就不行了。没想通。
实在没辙,突然想到了m3u格式,这个简单得多,一下子就成功了,所以结论是:还是通用的音乐列表格式靠谱╮(╯▽╰)╭
<span style="font-family:SimSun;font-size:14px;">import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class MP3 { private static int count = 0; public static void main(String[] args) throws IOException { long a = System.currentTimeMillis(); numOfSongs("D:\\Music"); M3Uhead(); refreshFileList("D:\\Music"); System.out.println("Time elapsed: " + (System.currentTimeMillis() - a) + " ms"); } public static void M3Uhead() throws IOException { FileOutputStream fos = new FileOutputStream("D:\\list.m3u", true); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); bw.write("#EXTM3U"); bw.newLine(); bw.close(); } public static void WPLhead() throws IOException { FileOutputStream fos = new FileOutputStream("D:\\Music\\list.wpl", true); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); bw.write("<?wpl version=\"1.0\"?>\n<smil>\n <head>\n"); bw.write(" <meta name=\"Generator\" content=\"Microsoft Windows Media Player -- 12.0.7601.18150\"/>\n"); bw.write(" <meta name=\"ItemCount\" content=\"" + count + "\"/>\n <title>list</title>\n"); bw.write(" </head>\n <body>\n <seq>\n"); bw.close(); } public static void WPLtail() throws IOException { FileOutputStream fos = new FileOutputStream("D:\\Music\\list.wpl", true); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); bw.write(" </seq>\n </body>\n</smil>"); bw.close(); } public static void numOfSongs(String strPath) throws IOException { File dir = new File(strPath); File[] files = dir.listFiles(); if (files == null) return; for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { numOfSongs(files[i].getAbsolutePath()); } else { String strFileName = files[i].getAbsolutePath(); if(strFileName.endsWith("mp3") || strFileName.endsWith("wma")) { count++; } } } } public static void refreshFileList(String strPath) throws IOException { File dir = new File(strPath); File[] files = dir.listFiles(); FileOutputStream fos = new FileOutputStream("D:\\list.m3u", true); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); if (files == null) { bw.close(); return; } for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { //bw.write(files[i].getAbsolutePath()); //bw.newLine(); refreshFileList(files[i].getAbsolutePath()); } else { //String strFileName = files[i].getAbsolutePath().toLowerCase(); String strFileName = files[i].getAbsolutePath(); String fileName = "#EXTINF:0," + files[i].getName(); //System.out.println("---"+strFileName); if(strFileName.endsWith("mp3") || strFileName.endsWith("wma") || strFileName.endsWith("m4a")) { //strFileName = " <media src=\"" + strFileName + "\"/>"; bw.write(fileName); bw.newLine(); bw.write(strFileName); bw.newLine(); bw.newLine(); } //filelist.add(files[i].getAbsolutePath()); } } bw.close(); } }</span>