Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2534948
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: Java

2023-09-06 17:03:20

这是昨天写的使用while(true)版本的代码

点击(此处)折叠或打开

  1. public int readFile(INPUT input){
  2.         int lineIndex = 0; //当前行索引号
  3.         int skipSize = 0; //跳过的行数
  4.         int notifySize = 0; //进行数据通知的行数
  5.         int startIdx = input.startRowIndex(); //开始索引号
  6.         int endIdx = input.endRowIndex(); //结束索引号
  7.         RandomAccessFile raf = null;
  8.         try {
  9.             raf = new RandomAccessFile(input.filePath(),"r");
  10.             notify.readReady(input);
  11.         } catch (FileNotFoundException e) {
  12.             throw new ReadException(e);
  13.         }

  14.         while(true){
  15.             try {
  16.                 String strLine = raf.readLine(); //读取一行
  17.                 if(strLine != null){
  18.                     if(++lineIndex >= startIdx) {
  19.                         if(endIdx > 0 && lineIndex > endIdx){
  20.                             ++skipSize;
  21.                             continue;
  22.                         }else {
  23.                             notify.readLine(input, ++notifySize, lineIndex, formatData(strLine, input.getCharset())); //读取一行数据通知
  24.                         }
  25.                     }else{
  26.                        ++skipSize;
  27.                         continue;
  28.                     }
  29.                 }else{
  30.                     ++lineIndex;
  31.                     ++skipSize;
  32.                     break;
  33.                 }
  34.             } catch (IOException e) {
  35.                 throw new ReadException(e);
  36.             }
  37.         }
  38.         notify.readFinish(input, lineIndex, notifySize, skipSize); //读取完成
  39.         try {
  40.             raf.close(); //关闭
  41.         } catch (IOException e) {
  42.             throw new ReadException(e);
  43.         }

  44.         return notifySize;
  45.     }
下面的是用递归的方式进行处理:

点击(此处)折叠或打开

  1. /**
  2.      * 读取文件
  3.      * @param input 读入文件请求
  4.      * @return 读取的数据行数
  5.      */
  6.     public int readFile(INPUT input){
  7.         RandomAccessFile raf = null;
  8.         notifySize = 0;
  9.         try {
  10.             raf = new RandomAccessFile(input.filePath(),"r");
  11.             notify.readReady(input); //读取准备
  12.             //循环读取文件
  13.             return loopReadFile(input, raf, 0, 0, raf.readLine());
  14.         } catch (FileNotFoundException e) {
  15.             readFinish(input, raf, 0, 0); //异常处理
  16.             throw new ReadException(e);
  17.         } catch (IOException e) {
  18.             readFinish(input, raf, 0, 0); //异常处理
  19.             throw new ReadException(e);
  20.         }
  21.     }
  22.         
  23.     /**
  24.      * 循环读取文件
  25.      * @param input 输入对象
  26.      * @param currentIndex 当前行索引编码
  27.      * @param skipSize 跳过的数据量
  28.      * @param line 当前行数据
  29.      */
  30.     private int loopReadFile(INPUT input, RandomAccessFile raf, int currentIndex, int skipSize, String line){
  31.         if(line == null){ //对空文件进行支撑
  32.             readFinish(input, raf, currentIndex, skipSize);
  33.             return 0;
  34.         }

  35.         int startIdx = input.startRowIndex(); //开始索引号
  36.         int endIdx = input.endRowIndex(); //结束索引号
  37.         try {
  38.             if(++currentIndex >= startIdx) {
  39.                 String strNextLine = raf.readLine(); //下一行数据
  40.                 boolean readNext = strNextLine != null; //是否可以读取下一行数据
  41.                 if(endIdx > 0 && currentIndex > endIdx && readNext){
  42.                     loopReadFile(input, raf, currentIndex, ++skipSize, strNextLine); //递归调用
  43.                 }else {
  44.                     if(endIdx == 0 || (endIdx > 0 && currentIndex <= endIdx)) {
  45.                         notify.readLine(input, ++notifySize, currentIndex, getValue(line, input.getCharset()), readNext); //需注意通知观察者使用的是入参line
  46.                     }else{
  47.                         ++skipSize;
  48.                     }

  49.                     if(readNext) {
  50.                         loopReadFile(input, raf, currentIndex, skipSize, strNextLine); //进行递归调用,需要注意使用的是strNextLine变量值
  51.                     }else{
  52.                         readFinish(input, raf, currentIndex, skipSize); //完成
  53.                     }
  54.                 }
  55.             }else{
  56.                 loopReadFile(input, raf, currentIndex, ++skipSize, raf.readLine()); //递归调用
  57.             }
  58.         } catch (IOException e) {
  59.             readFinish(input, raf, currentIndex, skipSize); //出现异常时,进行处理
  60.             throw new ReadException(e);
  61.         }

  62.         return notifySize;
  63.     }
  64.     
  65.     /**
  66.      * 读取完成
  67.      * @param input 输入项
  68.      * @param raf RandomAccessFile对象
  69.      * @param currentIndex 当前行索引
  70.      * @param skipSize 跳过数量
  71.      * @return
  72.      */
  73.     private void readFinish(INPUT input, RandomAccessFile raf, int currentIndex, int skipSize){
  74.         try {
  75.             notify.readFinish(input, ++currentIndex, notifySize, ++skipSize);
  76.             raf.close();
  77.         } catch (IOException e) {
  78.             throw new ReadException(e);
  79.         }
  80.     }
折腾一天,其实只是为了观察者中,多了一个参数readNext,该参数可以标识出是否可以读取下一行,也就是标识出该行是否为文件{BANNED}最佳后一行。这样通过对观察者重写redLine方法,可以实现对首行,或者{BANNED}最佳后一行,可通过重写对其特殊处理。
比如一个文件内容如下:
begin
begin2
测试中文3
end4
end


我想对文件{BANNED}中国第一行的begin过滤掉,对文件{BANNED}最佳后一行为end过滤掉,不进行后续处理。那个通过改造,就可以实现。demo如下:

点击(此处)折叠或打开

  1. @Override
  2.     public void readLine(FileReadInput input, int index, int lineIndex, String data, boolean readNext) {
  3.         String mydata = data;
  4.         if(lineIndex == 1 && data.equals("begin")){ 
  5.             mydata = null;
  6.         }

  7.         if(data.equals("end") && !readNext){
  8.             mydata = null;
  9.         }

  10.         super.readLine(input, index, lineIndex, mydata, readNext); //调用原始方法,进行mydata变更后的数据传递
  11.     }

阅读(2866) | 评论(0) | 转发(0) |
0

上一篇:JavaScript进行数据比对

下一篇:没有了

给主人留下些什么吧!~~