從網上下了些脫口秀mp3,準備回家的時候在路上聽聽。
下載之後發現文件名都是以“某某網整理”開頭,導入到手機之後歌名長得連有用的信息都看不到了。
不想一個個改了,於是敲了幾行java,來了個批量重命名,有循環就是好啊!
package file;
import java.io.File;
public class ChangeFileName {
public static void main(String[] args) {
// TODO Auto-generated method stub
String parentDir="E:\\<span style="font-family:Microsoft YaHei;">脫口秀</span>\\2014\\";
File parent=new File(parentDir);
File[] files=parent.listFiles();
for (int i = 0; i < files.length; i++) {
String oldName=files[i].getName();
String newName=oldName.replace("【鴻新網www.hhxin.com整理】<span style="font-family:Microsoft YaHei;">脫口秀第</span>","");
newName=newName.replace("<span style="font-family:Microsoft YaHei;">期</span>:", "");
files[i].renameTo(new File(parentDir+newName));
}
}
}
可是再次導入到播放器之後,尼瑪居然還是有“某某網整理”!
用windows資源管理器看看屬性,發現原來“標題”纔是顯示在播放器中的歌名。
於是Google了一下怎樣用代碼修改這破屬性,發現那些信息是寫在MP3尾部(ID3v1)以及頭部的(ID3v2)。
找到一個可以修改尾部信息的代碼
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.io.UnsupportedEncodingException;
/**
* 獲得MP3文件的信息
*
*/
public class Test {
public static void main(String[] args) {
//TODO 演示
File MP3FILE = new File("test.mp3");
try {
Test info = new Test(MP3FILE);
info.setCharset("UTF-8");
System.out.println(info.getSongName());
System.out.println(info.getArtist());
System.out.println(info.getAlbum());
System.out.println(info.getYear());
System.out.println(info.getComment());
} catch (IOException e) {
e.printStackTrace();
}
}
private String charset = "utf-8";//解析MP3信息時用的字符編碼
private byte[] buf;//MP3的標籤信息的byte數組
/**
* 實例化一個獲得MP3文件的信息的類
* @param mp3 MP3文件
* @throws IOException 讀取MP3出錯或則MP3文件不存在
*/
public Test(File mp3) throws IOException{
buf = new byte[128];//初始化標籤信息的byte數組
RandomAccessFile raf = new RandomAccessFile(mp3, "r");//隨機讀寫方式打開MP3文件
raf.seek(raf.length() - 128);//移動到文件MP3末尾
raf.read(buf);//讀取標籤信息
raf.close();//關閉文件
if(buf.length != 128){//數據是否合法
throw new IOException("MP3標籤信息數據長度不合法!");
}
}
/**
* 獲得目前解析時用的字符編碼
* @return 目前解析時用的字符編碼
*/
public String getCharset() {
return charset;
}
/**
* 設置解析時用的字符編碼
* @param charset 解析時用的字符編碼
*/
public void setCharset(String charset) {
this.charset = charset;
}
public String getSongName(){
try {
return new String(buf,3,30,charset).trim();
} catch (UnsupportedEncodingException e) {
return new String(buf,3,30).trim();
}
}
public String getArtist(){
try {
return new String(buf,33,30,charset).trim();
} catch (UnsupportedEncodingException e) {
return new String(buf,33,30).trim();
}
}
public String getAlbum(){
try {
return new String(buf,63,30,charset).trim();
} catch (UnsupportedEncodingException e) {
return new String(buf,63,30).trim();
}
}
public String getYear(){
try {
return new String(buf,93,4,charset).trim();
} catch (UnsupportedEncodingException e) {
return new String(buf,93,4).trim();
}
}
public String getComment(){
try {
return new String(buf,97,28,charset).trim();
} catch (UnsupportedEncodingException e) {
return new String(buf,97,28).trim();
}
}
}
尼瑪居然現在的MP3都使用了存儲信息量大的ID3v2,而且信息的長度都不固定,這讓我怎麼找到id="TIT2"的數據幀啊!
閱讀了不知多少時間的id3v2.3文檔之後,我TM終於受不了了!
於是我打開資源管理器,全選音頻,進入屬性頁,
然後愉快地把標題的值改爲空,確定之後所有的標題就都被我改爲空啦!
沒有標題的話播放器就會把文件名當成歌名的。
就是這麼簡單!放着寫好的接口你不去調用,真TM的無聊。。。。。。