A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁佼 黑马帝   /  2012-4-27 15:07  /  2899 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;

  2. class MyLrcReader{

  3. public static void main(String[] arg) throws Exception{

  4.     MyLrcReader lrcReader = new MyLrcReader(); //主函数无法调用非静态方法,建立对象来完成调用
  5.     File lrcFile = lrcReader.getLrcPath();                  //获取一个正确可用的源文件

  6.     System.out.println("开始读取"+lrcFile.getName());
  7.     BufferedReader fileRead = new BufferedReader(new FileReader(lrcFile));
  8.     String lineLrc =null;
  9.     while ( ( lineLrc= fileRead.readLine() ) !=null){
  10.         System.out.println(lineLrc+"打印于主函数,lrc的length为:"+lineLrc.length());
  11.         lrcReader .Print(lineLrc);   //调用打印方法
  12.     }
  13.     System.out.println(lrcFile.getName()+"读取完毕");
  14. }


  15. //文件名读取、判断函数
  16. private File getLrcPath() throws Exception{
  17.     int i = 0;
  18.     File lrcFile = null;
  19.     while( i != 1 ){
  20.         System.out.println("请输入lrc文件的途径,书写必须包含后缀");
  21.         BufferedReader pathInput = new BufferedReader(new InputStreamReader(System.in));
  22.         String lrcPath = pathInput.readLine();
  23.         if (lrcPath.endsWith(".lrc")){
  24.             lrcFile = new File(lrcPath);
  25.             if( ! lrcFile.exists() ){
  26.                 System.out.println("文件不存在");
  27.                 System.out.println();
  28.                 continue ;//文件不存在则提示错误,并再次等待输入
  29.             }
  30.             i = 1;//达到循环终止条件
  31.         }else {
  32.             System.out.println("文件名错误");
  33.             System.out.println();
  34.         }
  35. }
  36.     return lrcFile;
  37. }

  38. //lrc文件输出
  39. private void Print(String lrc )throws Exception{

  40.     System.out.println(lrc);
  41.     //根据歌词各部分区别,进行不同的切割处理
  42.     if (lrc.startsWith("[ti:") ){
  43.         System.out.println(lrc.substring(4, lrc.length()-1) );
  44.     }else if (lrc.startsWith("[ar:") ){
  45.         System.out.println(lrc.substring(4, lrc.length()-1) );
  46.     }else if (lrc.startsWith("[al:") ){
  47.         System.out.println(lrc.substring(4, lrc.length()-1) );
  48.     }else if (lrc.startsWith("[by:") ){
  49.         System.out.println(lrc.substring(4, lrc.length()-1) );
  50.     }else{
  51.         System.out.println(lrc);
  52.         String[] lrcPart = lrc.split( "\\]" );  //将歌词和时间切割开
  53.         //System.out.println(lrcPart.length);
  54.         //System.out.println(lrcPart[0]);
  55.         
  56.         //获取延迟时间
  57.         String[] timeMsPart = lrcPart[0].split( "." );
  58.         String[] timeSecPart = timeMsPart[0].split( ":" );
  59.         String[] timeMinPart = timeSecPart[0].split( "\\[" );//substring(1, timeSecPart[0].length()-1) ;
  60.         System.out.println(timeMsPart[0]);
  61.         System.out.println(timeSecPart[0]);
  62.         System.out.println(timeMinPart[0]);
  63.         Long time = null;
  64.         time = Long.parseLong(timeMsPart[1])
  65.             +Long.parseLong(timeSecPart[1])*100
  66.             +Long.parseLong(timeMinPart[1])*6000;

  67.         //打印后暂停指定的时间
  68.         System.out.println(lrcPart [1]);
  69.         this.wait(time);
  70.     }
  71. }
  72. }
复制代码
读取的文件名为abc.lrc ,内容为:
[ti:Bressanone  布列瑟农]
[ar:马修·连恩]
[al:《狼》]
[by:炫网资讯 Liuxuan.com]
[00:00.00]BRESSANONE  布列瑟农
[00:05.00]歌手:马修·连恩
[00:15.00]译文:我站在布列瑟侬的星空下
[00:19.00]而星星 也在天的另一边照着布列瑟农

哪位能帮分析下,为什么读完“[by:炫网资讯 Liuxuan.com]” 之后再读“[00:00.00]BRESSANONE  布列瑟农 ”就读不出来了,读的是空字符串。。。然后lrc.split( "\\]" );  完全就是笑话了。。后面全错。。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

4 个回复

倒序浏览
  String[] timeMsPart = lrcPart[0].split( "." );
这行代码,.在java正则表达式中表示可以匹配任意一字符,那么你想把他当成一个普通的字符来使用则需要转义写成 \\.就好
程序中还有些小问题,自己再改改吧,

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
徐慧书 发表于 2012-4-27 15:48
String[] timeMsPart = lrcPart[0].split( "." );
这行代码,.在java正则表达式中表示可以匹配任意一字符 ...

。。又是正则。。我去补习一下。。
不过正则表达式有问题的话,应该是在后期才出问题啊。
在主函数里打印的语句,到“[by:炫网资讯 Liuxuan.com] ”后面再读文件就没有内容了。
回复 使用道具 举报
我试了改为\\.就没问题的,但是你程序中还有好些其他小问题的
回复 使用道具 举报
  1. package com.test;
  2. import java.io.*;

  3. class MyLrcReader{

  4. public static void main(String[] arg) throws Exception{

  5.     MyLrcReader lrcReader = new MyLrcReader(); //主函数无法调用非静态方法,建立对象来完成调用
  6.     File lrcFile = lrcReader.getLrcPath();                  //获取一个正确可用的源文件

  7.     System.out.println("开始读取"+lrcFile.getName());
  8.     BufferedReader fileRead = new BufferedReader(new FileReader(lrcFile));
  9.     String lineLrc =null;
  10.     while ( ( lineLrc= fileRead.readLine() ) !=null){
  11.         System.out.println(lineLrc+"打印于主函数,lrc的length为:"+lineLrc.length());
  12.         lrcReader.Print(lineLrc);   //调用打印方法
  13.     }
  14.     System.out.println(lrcFile.getName()+"读取完毕");
  15. }


  16. //文件名读取、判断函数
  17. private File getLrcPath() throws Exception{
  18.     int i = 0;
  19.     File lrcFile = null;
  20.     while( i != 1 ){
  21.         System.out.println("请输入lrc文件的途径,书写必须包含后缀");
  22.         BufferedReader pathInput = new BufferedReader(new InputStreamReader(System.in));
  23.         String lrcPath = pathInput.readLine();
  24.         if (lrcPath.endsWith(".lrc")){
  25.             lrcFile = new File(lrcPath);
  26.             if( ! lrcFile.exists() ){
  27.                 System.out.println("文件不存在");
  28.                 System.out.println();
  29.                 continue ;//文件不存在则提示错误,并再次等待输入
  30.             }
  31.             i = 1;//达到循环终止条件
  32.         }else {
  33.             System.out.println("文件名错误");
  34.             System.out.println();
  35.         }
  36. }
  37.     return lrcFile;
  38. }

  39. //lrc文件输出
  40. private void Print(String lrc )throws Exception{
  41.        
  42.     System.out.println(lrc);
  43.     //根据歌词各部分区别,进行不同的切割处理
  44.     if (lrc.startsWith("[ti:") ){
  45.         System.out.println(lrc.substring(4, lrc.length()-1) );
  46.     }else if (lrc.startsWith("[ar:") ){
  47.         System.out.println(lrc.substring(4, lrc.length()-1) );
  48.     }else if (lrc.startsWith("[al:") ){
  49.         System.out.println(lrc.substring(4, lrc.length()-1) );
  50.     }else if (lrc.startsWith("[by:") ){
  51.         System.out.println(lrc.substring(4, lrc.length()-1) );
  52.     }else{
  53.         System.out.println(lrc);
  54.         String[] lrcPart = lrc.split( "\\]" );  //将歌词和时间切割开
  55.         //System.out.println(lrcPart.length);
  56.         //System.out.println(lrcPart[0]);
  57.       
  58.         //获取延迟时间
  59.         System.out.println(lrcPart[0]);
  60.   
  61.         String[] timeMsPart = lrcPart[0].split("\\.");
  62.         String[] timeSecPart = timeMsPart[0].split( ":" );
  63.         System.out.println("dddd");
  64.         String[] timeMinPart = timeSecPart[0].split( "\\[" );//substring(1, timeSecPart[0].length()-1) ;
  65.         System.out.println(timeMsPart[0]);
  66.         System.out.println(timeSecPart[0]);
  67.         System.out.println(timeMinPart[0]);
  68.         Long time = null;
  69.         time = Long.parseLong(timeMsPart[1])
  70.             +Long.parseLong(timeSecPart[1])*100
  71.             +Long.parseLong(timeMinPart[1])*6000;

  72.         //打印后暂停指定的时间
  73.         System.out.println(lrcPart [1]);
  74.         System.out.println("time :" + time);
  75.       
  76.         if(time != 0){
  77.         synchronized (this) {
  78.                 this.wait(time);
  79.         }}
  80.         

  81.     }
  82. }
  83. }

  84. 我改了下!这里的“.” 要改成“\\.”这里是需要去转义的!还有就下面的
  85. this.wait(time);
  86. 我去测试了下。首先去加下锁的。这里关系到线程。还有就是当time为0的时候不要等待直接过就可以了。
  87. 不知道能不能帮上你了!谢谢!
复制代码

点评

以后不用把所有代码都copy下来,关键点截图说明就很OK哈!  发表于 2012-4-28 23:25
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马