android 歌词解析
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 歌词解析的更多相关文章
- android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 三: 把复杂对象转换成 xml
前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...
- android XMl 解析神奇xstream 二: 把对象转换成xml
前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...
- Android动画解析--XML
动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面 ...
- android 中解析XML的方法(转)
在XML解析和使用原始XML资源中都涉及过对XML的解析,之前使用的是 DOM4J和 XmlResourceParser 来解析的.本文中将使用XmlPullParser来解析,分别解析不同复杂度的t ...
- OC3_歌词解析
// // LrcManager.h // OC3_歌词解析 // // Created by zhangxueming on 15/6/15. // Copyright (c) 2015年 zhan ...
- 实现android上解析Json格式数据功能
实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...
随机推荐
- tabs左右滚动
$(function () { //IdivLeft小于0,说明左边还有菜单,菜单总数大于8 //IdivLeft等于0,说明菜单总数小于8 //IdivLeft大于0,说明右边还有菜单,菜单总数大于 ...
- InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序) 标签: InstallShieldVS2013 2015 ...
- Shader LOD
设置:单个设置Shader.maximumLOD.全局设置Shader.globalMaximumLOD.QualitySettings里面的Maximum LODLevel 原理:小于指定值的sha ...
- 关于MySQL密码你应该知道的那些事
本文将介绍MySQL用户密码相关的一些知识,以及5.6中对于安全性的一些改进 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,如果格式显示混乱,请通过以下链 ...
- c#基础之数组
最近看了c#的数组,比c++的数组更加直接,.net也提供了很多直接直接操纵数组的方法,非常方便,所以就想做个总结. 利用数组,我们可以使用变量来声明相同类型的多个数据项的集合,数组中的每个数据使用索 ...
- 浅谈servlet版本
说白话,eclipseJ2EE版本新建一个web项目后,在IDE中的项目根目录下会看到2.3,2.4,2.5,3.0,3.1....据说最新的4.0在路上,已经有草案了,很期待ing. 360百科是这 ...
- 初探JavaScript(四)——作用域链和声明提前
前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活.往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望.与此同时,也让诸多的老“园”工看完这些 ...
- 推荐15款最好的 Twitter Bootstrap 开发工具
Twitter Bootstrap 自从2011年最初发布到网上后,迅速成为 Web 领域最流行的响应式前端开发框架之一,是网页设计的优秀实践.Twitter Bootstrap 框架包含了众多的预定 ...
- Azure Automation (3) 定期将某个Azure订阅下的所有虚拟机开关机
<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 在笔者之前的文章中,我们介绍了使用Azure Automation ...
- Log4net 日志使用介绍
概述 Log4net 有三个主要组件:loggers,appenders 和 layouts.这三个组件一起工作使得开发者能够根据信息类型和等级(Level)记录信息,以及在运行时控制信息的格式化和信 ...