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();
}
} }

android 歌词解析的更多相关文章

  1. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  2. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  3. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  4. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  5. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  6. Android动画解析--XML

    动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面 ...

  7. android 中解析XML的方法(转)

    在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的.本文中将使用XmlPullParser来解析,分别解析不同复杂度的t ...

  8. OC3_歌词解析

    // // LrcManager.h // OC3_歌词解析 // // Created by zhangxueming on 15/6/15. // Copyright (c) 2015年 zhan ...

  9. 实现android上解析Json格式数据功能

    实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...

随机推荐

  1. salesforce 零基础学习(十六)Validation Rules & Date/time

    上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...

  2. Java EE开发平台随手记1

    过完春节以来,一直在负责搭建公司的新Java EE开发平台,所谓新平台,其实并不是什么新技术,不过是将目前业界较为流行的框架整合在一起,做一些简单的封装和扩展,让开发人员更加易用. 和之前负责具体的项 ...

  3. HTTP学习四:SPDY和HTTP/2.0

    1 HTTP1.0/1.1与HTTPS的不足 1.1 HTTP1.0/1.1不足 单路连接 HTTP 协议的最大弊端就是每个 TCP 连接只能对应一个 HTTP 请求,即每个 HTTP 连接只请求一个 ...

  4. 锋利的jQuery——19个jQuery 常用片段整理

    /** * Created by yu on 2016/11/20 0020. */// 1.禁用页面右键菜单$(function () { $(document).on('contextmenu', ...

  5. poj1006生理周期(中国剩余定理)

    /* 中国剩余定理可以描述为: 若某数x分别被d1..….dn除得的余数为r1.r2.….rn,则可表示为下式: x=R1r1+R2r2+…+Rnrn+RD 其中R1是d2.d3.….dn的公倍数,而 ...

  6. ASP.NET 5中的那些K

    ASP.NET 5最大的变化是什么?首当其冲的就是多了很多K,K表示的是ASP.NET vNext的项目代号“Project K”,但很容易让人想到一个汉字——“坑”,希望K不要成为“坑”的缩写. K ...

  7. Skeljs – 用于构建响应式网站的前端开发框架

    skelJS 是一个轻量级的前端框架,用于构建响应式站点和应用程序.让设计人员和开发人员可能够使用四个强大的组件:CSS 网格系统,响应式处理程序,CSS 的快捷方式和插件系统. 您可能感兴趣的相关文 ...

  8. Animo.js :一款管理 CSS 动画的强大的小工具

    Animo.js 是一个功能强大的小工具,用于管理 CSS 动画.它的特色功能包括像堆栈动画,创建跨浏览器的模糊,设置动画完成的回调等等.Animo 还包括惊人的 animate.css,为您提供了近 ...

  9. 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?

    第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...

  10. SQL Server存储(6/8) :理解DCM页

    我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map:DCM ),还有差异备份(differen ...