import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Hashtable; /** * <b>歌词解析类</b> * * @author 席有芳 * @QQ QQ:951868171 * @version 1.0 * @email xi_yf_001@126.com */ public class LrcDecode { private Hashtable<String, String> lrcTable = null; /** * 解析Lrc */ public LrcDecode readLrc(InputStream is) { lrcTable = new Hashtable<String, String>(); try { BufferedReader bis = new BufferedReader(new InputStreamReader(is, "gbk")); String str = null; while ((str = bis.readLine()) != null) { decodeLine(str); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); lrcTable = null; } return this; } /** * 单行解析 */ private LrcDecode decodeLine(String str) { if (str.startsWith("[ti:")) {// 歌曲名 lrcTable.put("ti", str.substring(4, str.lastIndexOf("]"))); } else if (str.startsWith("[ar:")) {// 艺术家 lrcTable.put("ar", str.substring(4, str.lastIndexOf("]"))); } else if (str.startsWith("[al:")) {// 专辑 lrcTable.put("al", str.substring(4, str.lastIndexOf("]"))); } else if (str.startsWith("[by:")) {// 作词 lrcTable.put("by", str.substring(4, str.lastIndexOf("]"))); } else if (str.startsWith("[la:")) {// 语言 lrcTable.put("la", str.substring(4, str.lastIndexOf("]"))); } else { // 歌词正文 int startIndex = -1; while ((startIndex = str.indexOf("[", startIndex + 1)) != -1) { int endIndex = str.indexOf("]", startIndex + 1); // 添加时间戳格式 lrcTable.put(strToLongToTime(str.substring(startIndex + 1, endIndex)) + "", str.substring(str.lastIndexOf("]") + 1, str.length())); } } return this; } /** * 获取解析成功的歌词 */ public Hashtable<String, String> getLrcTable() { return lrcTable; } /** * 保证时间格式一致 为m:ss * * @param str * 时间字符 * @return 判断用的时间符 */ private String strToLongToTime(String str) { // System.out.println(str); int m = Integer.parseInt(str.substring(0, str.indexOf(":"))); int s = 0; int ms = 0; // 判断歌词时间是否有毫秒 if (str.indexOf(".") != -1) { s = Integer.parseInt(str.substring(str.indexOf(":") + 1, str.indexOf("."))); ms = Integer.parseInt(str.substring(str.indexOf(".") + 1, str.length())); } else { s = Integer.parseInt(str.substring(str.indexOf(":") + 1, str.length())); } // System.out.println(timeMode(m * 60000 + s * 1000 + ms * 10)); return timeMode(m * 60000 + s * 1000 + ms * 10); } /** * 返回时间 * * @param time * 毫秒时间 */ public static String timeMode(int time) { int tmp = (time / 1000) % 60; if (tmp < 10) return time / 60000 + ":" + "0" + tmp; else return time / 60000 + ":" + tmp; } public static void main(String[] str) { try { FileInputStream f = new FileInputStream("D:" + File.separator + "google" + File.separator + "一点点.lrc"); LrcDecode lrcDecode = new LrcDecode(); lrcDecode.readLrc(f); if (lrcDecode.getLrcTable() != null) { // 转换时间并输出内容,3000为当前时间currentTime System.out.println(lrcDecode.getLrcTable().get(LrcDecode.timeMode(3000))); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }