黑马程序员技术交流社区

标题: 文件读取的问题 [打印本页]

作者: 史卜坤    时间: 2012-7-12 11:05
标题: 文件读取的问题
  • import java.io.*;
  • class MyLrcReader{
  • public static void main(String[] arg) throws Exception{
  •     MyLrcReader lrcReader = new MyLrcReader(); //主函数无法调用非静态方法,建立对象来完成调用
  •     File lrcFile = lrcReader.getLrcPath();                  //获取一个正确可用的源文件
  •     System.out.println("开始读取"+lrcFile.getName());
  •     BufferedReader fileRead = new BufferedReader(new FileReader(lrcFile));
  •     String lineLrc =null;
  •     while ( ( lineLrc= fileRead.readLine() ) !=null){
  •         System.out.println(lineLrc+"打印于主函数,lrc的length为:"+lineLrc.length());
  •         lrcReader .Print(lineLrc);   //调用打印方法
  •     }
  •     System.out.println(lrcFile.getName()+"读取完毕");
  • }
  • //文件名读取、判断函数
  • private File getLrcPath() throws Exception{
  •     int i = 0;
  •     File lrcFile = null;
  •     while( i != 1 ){
  •         System.out.println("请输入lrc文件的途径,书写必须包含后缀");
  •         BufferedReader pathInput = new BufferedReader(new InputStreamReader(System.in));
  •         String lrcPath = pathInput.readLine();
  •         if (lrcPath.endsWith(".lrc")){
  •             lrcFile = new File(lrcPath);
  •             if( ! lrcFile.exists() ){
  •                 System.out.println("文件不存在");
  •                 System.out.println();
  •                 continue ;//文件不存在则提示错误,并再次等待输入
  •             }
  •             i = 1;//达到循环终止条件
  •         }else {
  •             System.out.println("文件名错误");
  •             System.out.println();
  •         }
  • }
  •     return lrcFile;
  • }
  • //lrc文件输出
  • private void Print(String lrc )throws Exception{
  •     System.out.println(lrc);
  •     //根据歌词各部分区别,进行不同的切割处理
  •     if (lrc.startsWith("[ti:") ){
  •         System.out.println(lrc.substring(4, lrc.length()-1) );
  •     }else if (lrc.startsWith("[ar:") ){
  •         System.out.println(lrc.substring(4, lrc.length()-1) );
  •     }else if (lrc.startsWith("[al:") ){
  •         System.out.println(lrc.substring(4, lrc.length()-1) );
  •     }else if (lrc.startsWith("[by:") ){
  •         System.out.println(lrc.substring(4, lrc.length()-1) );
  •     }else{
  •         System.out.println(lrc);
  •         String[] lrcPart = lrc.split( "\\]" );  //将歌词和时间切割开
  •         //System.out.println(lrcPart.length);
  •         //System.out.println(lrcPart[0]);
  •         //获取延迟时间
  •         String[] timeMsPart = lrcPart[0].split( "." );
  •         String[] timeSecPart = timeMsPart[0].split( ":" );
  •         String[] timeMinPart = timeSecPart[0].split( "\\[" );//substring(1, timeSecPart[0].length()-1) ;
  •         System.out.println(timeMsPart[0]);
  •         System.out.println(timeSecPart[0]);
  •         System.out.println(timeMinPart[0]);
  •         Long time = null;
  •         time = Long.parseLong(timeMsPart[1])
  •             +Long.parseLong(timeSecPart[1])*100
  •             +Long.parseLong(timeMinPart[1])*6000;
  •         //打印后暂停指定的时间
  •         System.out.println(lrcPart [1]);
  •         this.wait(time);
  •     }
  • }
  • }

复制代码
读取的文件名为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( "\\]" );  完全就是笑话了。。后面全错。。


作者: 游兴钟    时间: 2012-7-12 13:09
本帖最后由 achilles 于 2012-7-12 15:23 编辑

import java.io.*;

class MyLrcReader{

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

   MyLrcReader lrcReader = new MyLrcReader(); //主函数无法调用非静态方法,建立对象来完成调用
    File lrcFile = lrcReader.getLrcPath();                  //获取一个正确可用的源文件
   System.out.println("开始读取"+lrcFile.getName());
    BufferedReader fileRead = new BufferedReader(new FileReader(lrcFile));
    String lineLrc =null;
    while ( ( lineLrc= fileRead.readLine() ) !=null){
                if(lineLrc.length()==0)//加入判断,防止后面的空角标异常导致程序无法结束
                      break;
        System.out.println(lineLrc+"打印于主函数,lrc的length为:"+lineLrc.length());
        lrcReader .Print(lineLrc);   //调用打印方法
    }
    System.out.println(lrcFile.getName()+"读取完毕");
}


//文件名读取、判断函数
private File getLrcPath() throws Exception{
    int i = 0;
    File lrcFile = null;
    while( i != 1 ){
        System.out.println("请输入lrc文件的途径,书写必须包含后缀");
        BufferedReader pathInput = new BufferedReader(new InputStreamReader(System.in));
        String lrcPath = pathInput.readLine();
        if (lrcPath.endsWith(".lrc")){
            lrcFile = new File(lrcPath);
            if( ! lrcFile.exists() ){
                System.out.println("文件不存在");
                System.out.println();
                continue ;//文件不存在则提示错误,并再次等待输入
            }
            i = 1;//达到循环终止条件
        }else {
            System.out.println("文件名错误");
            System.out.println();
        }
}
    return lrcFile;
}

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

    System.out.println(lrc);
    //根据歌词各部分区别,进行不同的切割处理
    if (lrc.startsWith("[ti:") ){
        System.out.println(lrc.substring(4, lrc.length()-1) );
    }else if (lrc.startsWith("[ar:") ){
        System.out.println(lrc.substring(4, lrc.length()-1) );
    }else if (lrc.startsWith("[al:") ){
        System.out.println(lrc.substring(4, lrc.length()-1) );
    }else if (lrc.startsWith("[by:") ){
        System.out.println(lrc.substring(4, lrc.length()-1) );
    }else{
        System.out.println(lrc);
        String[] lrcPart = lrc.split( "]" );  //将歌词和时间切割开
        //System.out.println(lrcPart.length);
        System.out.println("lrc"+lrcPart[0]);
               
        //获取延迟时间
        
        String[] timeMsPart = lrcPart[0].split( "\\." );// .在正则中有意义 要使用.作为切割标示要先转义
       String[] timeSecPart = timeMsPart[0].split( "\\:" );
        String[] timeMinPart = timeSecPart[0].split( "\\[" );//substring(1, timeSecPart[0].length()-1) ;
        System.out.println(timeMsPart[0]);
        System.out.println(timeSecPart[0]);
        System.out.println(timeMinPart[0]);
       Long time = 0L;
       time = Long.parseLong(timeMsPart[1])
          +Long.parseLong(timeSecPart[1])*100
           +Long.parseLong(timeMinPart[1])*6000;

        //打印后暂停指定的时间
               
                        System.out.println(lrcPart [lrcPart.length-1]);//修改完防止角标越界               
                        
                Thread.sleep(time);// 要实现等待功能可以调用sleep方法  而wait方法是用于多线程控制的 这里不涉及多线程 用wait还会      
                                             // 抛 IllegalMonitorStateException异常  导致程序无法正常运行            
               
    }
}
}
代码修改完并调试完了  现在可以实现你期望的效果了 修改过的地方使用红色加了备注
作者: 游兴钟    时间: 2012-7-12 20:40
楼主下次不要再把行号弄上来了{:soso_e127:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2