Chinaunix首页 | 论坛 | 博客
  • 博客访问: 207992
  • 博文数量: 102
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1015
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-05 16:45
文章存档

2014年(73)

2013年(29)

我的朋友

分类: Android平台

2014-04-06 16:44:49

Mp3Player(6) LrcProcessor、Pattern

点击(此处)折叠或打开

  1. //LrcProcessor.java
  2. package com.lwb.lrc;

  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. import java.util.ArrayList;
  8. import java.util.LinkedList;
  9. import java.util.Queue;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;

  12. /**LrcProcessor歌词处理类
  13.  * 根据歌词文件的名字,读取歌词文件当中的信息
  14.  * 对歌词文件对象的输入流inputSteam进行处理queues = lrcProcessor.process(inputStream);
  15.  * 返回的是一个队列Queue,里边包含两个队列,一个是时间,另一个是歌词队列。
  16.  * */
  17. public class LrcProcessor {
  18.     
  19.     /*ArrayList process(InputStream inputStream)
  20.      * 对歌词文件对象的输入流inputSteam进行处理process(inputStream);
  21.      * 返回的是一个队列Queue,里边包含两个队列,一个是时间,另一个是歌词队列。
  22.      *1、创建一个LinkedList型的队列Queue timeMills存放时间
  23.      * Queue timeMills = new LinkedList();
  24.      *2、创建一个LinkedList型的队列Queue messages存放歌词
  25.      * Queue messages = new LinkedList();
  26.      *3、创建一个ArrayList用于存放上面的两个队列Queue,最后函数的返回也是这个
  27.      * Arraylist queues = new ArrayList()
  28.      *4、创建读输入流对象inputReader = InputStreamReader(inputStream);传入参数是要才处理歌词对应的输入流inputSteam
  29.      * 从这里并根据之前看出很多都是对流的操作而不是字符串,可能输入输出流容量比字符串更大和操作方便的原因
  30.      *5、把读输入流转化为读缓冲:BufferedReader bufferedReader = new BufferedReader(inputReader);
  31.      *6、填写正则表达式:Pattern p = Pattern.compile(""\\[([^\\]]+)\\");
  32.      *7、循环读读缓冲区中数据,每次读一行(inputStream->bufferedReader->string),进行处理
  33.      *
  34.      
  35.      */
  36.     public ArrayList<Queue> process(InputStream inputStream){
  37.         //存放时间点数据
  38.         Queue<Long> timeMills = new LinkedList<Long>();
  39.         //存放时间所对应的歌词
  40.         Queue<String> messages = new LinkedList<String>();
  41.         ArrayList<Queue> queues = new ArrayList<Queue>();//???????
  42.         try{
  43.             //创建BufferedReader对象
  44.             InputStreamReader inputReader = new InputStreamReader(inputStream);
  45.      BufferedReader bufferedReader = new BufferedReader(inputReader);        
  46.             int i = 0;
  47.             //创建一个正则表达式对象
  48.             Pattern p = Pattern.compile("\\[([^\\]]+)\\]");//其中\\表转义符号
  49.             String result = null;
  50.             boolean b = true;    
  51.             String temp = null;
  52.             while((temp = bufferedReader.readLine())!= null){
  53.                 i++;
  54.                 Matcher m = p.matcher(temp);
  55.                 if(m.find()){
  56.                     if(result != null){
  57.                         messages.add(result);
  58.                     }
  59.                     
  60.                     String timeStr = m.group();
  61.                     /*对于匹配器 m、输入序列 s 和组索引 g,
  62.                      * 表达式 m.group(g) 和 s.substring(m.start(g), m.end(g)) 是等效的。
  63.                      * 捕获组是从 1 开始从左到右的索引。组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。                    
  64.                      * 这一点见:*/

  65.                     Long timeMill = time2Long(timeStr.substring(1,timeStr.length()-1));
  66.                     if(b){
  67.                         timeMills.offer(timeMill);
  68.                         /*一般list或是queue都不用限制大小,如果在超出jvm限制的时候用add方法会抛出异常,
  69.                          * 而offer方法会返回false。我觉得offer和add不存在谁好谁坏的说法。add用在链表中,
  70.                          * offer用在队列中,前者是实现了list接口的方法,后者是实现了queue接口的方法,
  71.                          * 主要是针对不同的场景,选择合适的方法就行了。*/
  72.                     }
  73.                         String msg = temp.substring(10);
  74.                         /*stringObject.substring(start,stop)
  75.                          * 参数 描述
  76.                          * start 必需。一个非负的整数,规定要提取的子串的第一个字符在 stringObject 中的位置。
  77.                          * stop 可选。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1。
  78.                          * 如果省略该参数,那么返回的子串会一直到字符串的结尾。
  79.                          * */
  80.                         result = ""+msg +"\n";                        
  81.                 }
  82.                 else{
  83.                     result = result + temp +"\n";
  84.                 }            
  85.             }//end-while
  86.             messages.add(result);
  87.             queues.add(timeMills);
  88.             queues.add(messages);        
  89.         }
  90.         catch (IOException e) {
  91.             e.printStackTrace();
  92.         }
  93.             return queues;
  94.    }
  95.     
  96.     /*Long time2Long(String timeStr)返回Long型时间
  97.      * 将分钟,秒转换为毫秒
  98.      * @param timeStr
  99.      * @return */
  100.     public Long time2Long(String timeStr){
  101.         String s[] = timeStr.split(":");
  102.         /*split() 方法用于把一个字符串分割成字符串数组。
  103.          * 一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。
  104.          * 返回的数组中的字串不包括 separator 自身。但是,如果 separator 是包含子表达式的正则表达式,
  105.          * 那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。
  106.          * 见:
  107.          * */
  108.         int min = Integer.parseInt(s[0]);
  109.         /*parseInt(string s,int radix);
  110.          * 根据指定的基数radix返回字符串s表示的整数,如果省略了radix,则基数为10;
  111.          * parseInt("0", 10) 返回
  112.          * parseInt("473", 10) 返回 473
  113.          * parseInt("-0", 10) 返回
  114.          * parseInt("-FF", 16) 返回 -255
  115.          * */
  116.         String ss[] = s[1].split("\\.");
  117.         //"\\."要表示的时间是一个点 . \\都表示转义
  118.         int sec = Integer.parseInt(ss[0]);
  119.         int mill = Integer.parseInt(ss[1]);
  120.         return min*60*1000+sec*1000+ mill*10L;        
  121.     }
  122. }

阅读(576) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~