Mp3Player(6) LrcProcessor、Pattern
-
//LrcProcessor.java
-
package com.lwb.lrc;
-
-
import java.io.BufferedReader;
-
import java.io.IOException;
-
import java.io.InputStream;
-
import java.io.InputStreamReader;
-
import java.util.ArrayList;
-
import java.util.LinkedList;
-
import java.util.Queue;
-
import java.util.regex.Matcher;
-
import java.util.regex.Pattern;
-
-
/**LrcProcessor歌词处理类
-
* 根据歌词文件的名字,读取歌词文件当中的信息
-
* 对歌词文件对象的输入流inputSteam进行处理queues = lrcProcessor.process(inputStream);
-
* 返回的是一个队列Queue,里边包含两个队列,一个是时间,另一个是歌词队列。
-
* */
-
public class LrcProcessor {
-
-
/*ArrayList process(InputStream inputStream)
-
* 对歌词文件对象的输入流inputSteam进行处理process(inputStream);
-
* 返回的是一个队列Queue,里边包含两个队列,一个是时间,另一个是歌词队列。
-
*1、创建一个LinkedList型的队列Queue timeMills存放时间
-
* Queue timeMills = new LinkedList();
-
*2、创建一个LinkedList型的队列Queue messages存放歌词
-
* Queue messages = new LinkedList();
-
*3、创建一个ArrayList用于存放上面的两个队列Queue,最后函数的返回也是这个
-
* Arraylist queues = new ArrayList()
-
*4、创建读输入流对象inputReader = InputStreamReader(inputStream);传入参数是要才处理歌词对应的输入流inputSteam
-
* 从这里并根据之前看出很多都是对流的操作而不是字符串,可能输入输出流容量比字符串更大和操作方便的原因
-
*5、把读输入流转化为读缓冲:BufferedReader bufferedReader = new BufferedReader(inputReader);
-
*6、填写正则表达式:Pattern p = Pattern.compile(""\\[([^\\]]+)\\");
-
*7、循环读读缓冲区中数据,每次读一行(inputStream->bufferedReader->string),进行处理
-
*
-
-
*/
-
public ArrayList<Queue> process(InputStream inputStream){
-
//存放时间点数据
-
Queue<Long> timeMills = new LinkedList<Long>();
-
//存放时间所对应的歌词
-
Queue<String> messages = new LinkedList<String>();
-
ArrayList<Queue> queues = new ArrayList<Queue>();//???????
-
try{
-
//创建BufferedReader对象
-
InputStreamReader inputReader = new InputStreamReader(inputStream);
-
BufferedReader bufferedReader = new BufferedReader(inputReader);
-
int i = 0;
-
//创建一个正则表达式对象
-
Pattern p = Pattern.compile("\\[([^\\]]+)\\]");//其中\\表转义符号
-
String result = null;
-
boolean b = true;
-
String temp = null;
-
while((temp = bufferedReader.readLine())!= null){
-
i++;
-
Matcher m = p.matcher(temp);
-
if(m.find()){
-
if(result != null){
-
messages.add(result);
-
}
-
-
String timeStr = m.group();
-
/*对于匹配器 m、输入序列 s 和组索引 g,
-
* 表达式 m.group(g) 和 s.substring(m.start(g), m.end(g)) 是等效的。
-
* 捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。
-
* 这一点见:*/
-
-
Long timeMill = time2Long(timeStr.substring(1,timeStr.length()-1));
-
if(b){
-
timeMills.offer(timeMill);
-
/*一般list或是queue都不用限制大小,如果在超出jvm限制的时候用add方法会抛出异常,
-
* 而offer方法会返回false。我觉得offer和add不存在谁好谁坏的说法。add用在链表中,
-
* offer用在队列中,前者是实现了list接口的方法,后者是实现了queue接口的方法,
-
* 主要是针对不同的场景,选择合适的方法就行了。*/
-
}
-
String msg = temp.substring(10);
-
/*stringObject.substring(start,stop)
-
* 参数 描述
-
* start 必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。
-
* stop 可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。
-
* 如果省略该参数,那么返回的子串会一直到字符串的结尾。
-
* */
-
result = ""+msg +"\n";
-
}
-
else{
-
result = result + temp +"\n";
-
}
-
}//end-while
-
messages.add(result);
-
queues.add(timeMills);
-
queues.add(messages);
-
}
-
catch (IOException e) {
-
e.printStackTrace();
-
}
-
return queues;
-
}
-
-
/*Long time2Long(String timeStr)返回Long型时间
-
* 将分钟,秒转换为毫秒
-
* @param timeStr
-
* @return */
-
public Long time2Long(String timeStr){
-
String s[] = timeStr.split(":");
-
/*split() 方法用于把一个字符串分割成字符串数组。
-
* 一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。
-
* 返回的数组中的字串不包括 separator 自身。但是,如果 separator 是包含子表达式的正则表达式,
-
* 那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。
-
* 见:
-
* */
-
int min = Integer.parseInt(s[0]);
-
/*parseInt(string s,int radix);
-
* 根据指定的基数radix返回字符串s表示的整数,如果省略了radix,则基数为10;
-
* parseInt("0", 10) 返回
-
* parseInt("473", 10) 返回 473
-
* parseInt("-0", 10) 返回
-
* parseInt("-FF", 16) 返回 -255
-
* */
-
String ss[] = s[1].split("\\.");
-
//"\\."要表示的时间是一个点 . \\都表示转义
-
int sec = Integer.parseInt(ss[0]);
-
int mill = Integer.parseInt(ss[1]);
-
return min*60*1000+sec*1000+ mill*10L;
-
}
-
}
阅读(582) | 评论(0) | 转发(0) |