标签:
LRC歌词是一种应用广泛的歌词文件,对其进行解析时
标准格式: [分钟:秒.毫秒] 歌词
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.InputStreamReader; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.List; 8 import java.util.Map; 9 import java.util.Map.Entry; 10 import java.util.regex.Matcher; 11 import java.util.regex.Pattern; 12 13 public class TestLRC { 14 15 public static void main(String[] args) { 16 String path = "D:\\a.lrc"; // 歌词文件路径 17 TestLRC lrc = new TestLRC(); 18 List<Map<Long, String>> list = lrc.parse(path); 19 if (list != null) { 20 printLrc(list); 21 } 22 } 23 24 /** 25 * 解析LRC歌词文件 26 * 27 * @param path 28 * lrc文件路径 29 * @return 30 */ 31 private List<Map<Long, String>> parse(String path) { 32 // 存储所有歌词信息 33 List<Map<Long, String>> list = new ArrayList<Map<Long, String>>(); 34 try { 35 // String encoding = "utf-8"; // 字符编码,若与歌词文件编码不符将会出现乱码 36 String encoding = "GBK"; 37 File file = new File(path); 38 if (file.isFile() && file.exists()) { // 判断文件是否存在 39 InputStreamReader read = new InputStreamReader( 40 new FileInputStream(file), encoding); 41 BufferedReader bufferedReader = new BufferedReader(read); 42 String regex = "\\[(\\d{1,2}):(\\d{1,2}).(\\d{1,2})\\]"; 43 Pattern pattern = Pattern.compile(regex); // 创建 Pattern 对象 44 String lineStr = null; // 每次读取一行字符串 45 while ((lineStr = bufferedReader.readLine()) != null) { 46 Matcher matcher = pattern.matcher(lineStr); 47 while (matcher.find()) { 48 // 用于存储当前时间和文字信息的容器 49 Map<Long, String> map = new HashMap<Long, String>(); 50 // System.out.println(m.group(0)); // 例:[02:34.94] 51 // [02:34.94] ----对应---> [分钟:秒.毫秒] 52 String min = matcher.group(1); // 分钟 53 String sec = matcher.group(2); // 秒 54 String mill = matcher.group(3); // 毫秒,注意这里其实还要乘以10 55 long time = getLongTime(min, sec, mill + "0"); 56 // 获取当前时间的文本内容 57 String text = lineStr.substring(matcher.end()); 58 // System.out.println("text-->" + text); 59 map.put(time, text); // 添加到容器中 60 list.add(map); 61 } 62 } 63 read.close(); 64 return list; 65 } else { 66 System.out.println("找不到指定的文件:" + path); 67 } 68 } catch (Exception e) { 69 System.out.println("读取文件内容出错!"); 70 e.printStackTrace(); 71 } 72 return null; 73 } 74 75 /** 76 * 将以字符串形式给定的分钟、秒钟、毫秒转换成一个以毫秒为单位的long型数 77 * 78 * @param min 79 * 分钟 80 * @param sec 81 * 秒钟 82 * @param mill 83 * 毫秒 84 * @return 85 */ 86 private long getLongTime(String min, String sec, String mill) { 87 // 转成整型 88 int m = Integer.parseInt(min); 89 int s = Integer.parseInt(sec); 90 int ms = Integer.parseInt(mill); 91 92 if (s >= 60) { 93 System.out.println("警告: 出现了一个秒钟不正确的项 --> [" + min + ":" + sec + "." 94 + mill.substring(0, 2) + "]"); 95 } 96 // 组合成一个长整型表示的以毫秒为单位的时间 97 long time = m * 60 * 1000 + s * 1000 + ms; 98 return time; 99 } 100 101 /** 102 * 打印歌词信息 103 */ 104 private static void printLrc(List<Map<Long, String>> list) { 105 if (list != null && list.isEmpty()) { 106 System.out.println("没有任何歌词信息!"); 107 } 108 for (Map<Long, String> map : list) { 109 for (Entry<Long, String> entry : map.entrySet()) { 110 System.out.println("时间:" + entry.getKey() + " \t歌词:" 111 + entry.getValue()); 112 } 113 } 114 } 115 }
标签:
原文地址:http://www.cnblogs.com/wuqianling/p/5656761.html