这是昨天写的使用while(true)版本的代码
-
public int readFile(INPUT input){
-
int lineIndex = 0; //当前行索引号
-
int skipSize = 0; //跳过的行数
-
int notifySize = 0; //进行数据通知的行数
-
int startIdx = input.startRowIndex(); //开始索引号
-
int endIdx = input.endRowIndex(); //结束索引号
-
RandomAccessFile raf = null;
-
try {
-
raf = new RandomAccessFile(input.filePath(),"r");
-
notify.readReady(input);
-
} catch (FileNotFoundException e) {
-
throw new ReadException(e);
-
}
-
-
while(true){
-
try {
-
String strLine = raf.readLine(); //读取一行
-
if(strLine != null){
-
if(++lineIndex >= startIdx) {
-
if(endIdx > 0 && lineIndex > endIdx){
-
++skipSize;
-
continue;
-
}else {
-
notify.readLine(input, ++notifySize, lineIndex, formatData(strLine, input.getCharset())); //读取一行数据通知
-
}
-
}else{
-
++skipSize;
-
continue;
-
}
-
}else{
-
++lineIndex;
-
++skipSize;
-
break;
-
}
-
} catch (IOException e) {
-
throw new ReadException(e);
-
}
-
}
-
notify.readFinish(input, lineIndex, notifySize, skipSize); //读取完成
-
try {
-
raf.close(); //关闭
-
} catch (IOException e) {
-
throw new ReadException(e);
-
}
-
-
return notifySize;
-
}
下面的是用递归的方式进行处理:
-
/**
-
* 读取文件
-
* @param input 读入文件请求
-
* @return 读取的数据行数
-
*/
-
public int readFile(INPUT input){
-
RandomAccessFile raf = null;
-
notifySize = 0;
-
try {
-
raf = new RandomAccessFile(input.filePath(),"r");
-
notify.readReady(input); //读取准备
-
//循环读取文件
-
return loopReadFile(input, raf, 0, 0, raf.readLine());
-
} catch (FileNotFoundException e) {
-
readFinish(input, raf, 0, 0); //异常处理
-
throw new ReadException(e);
-
} catch (IOException e) {
-
readFinish(input, raf, 0, 0); //异常处理
-
throw new ReadException(e);
-
}
-
}
-
-
/**
-
* 循环读取文件
-
* @param input 输入对象
-
* @param currentIndex 当前行索引编码
-
* @param skipSize 跳过的数据量
-
* @param line 当前行数据
-
*/
-
private int loopReadFile(INPUT input, RandomAccessFile raf, int currentIndex, int skipSize, String line){
-
if(line == null){ //对空文件进行支撑
-
readFinish(input, raf, currentIndex, skipSize);
-
return 0;
-
}
-
-
int startIdx = input.startRowIndex(); //开始索引号
-
int endIdx = input.endRowIndex(); //结束索引号
-
try {
-
if(++currentIndex >= startIdx) {
-
String strNextLine = raf.readLine(); //下一行数据
-
boolean readNext = strNextLine != null; //是否可以读取下一行数据
-
if(endIdx > 0 && currentIndex > endIdx && readNext){
-
loopReadFile(input, raf, currentIndex, ++skipSize, strNextLine); //递归调用
-
}else {
-
if(endIdx == 0 || (endIdx > 0 && currentIndex <= endIdx)) {
-
notify.readLine(input, ++notifySize, currentIndex, getValue(line, input.getCharset()), readNext); //需注意通知观察者使用的是入参line
-
}else{
-
++skipSize;
-
}
-
-
if(readNext) {
-
loopReadFile(input, raf, currentIndex, skipSize, strNextLine); //进行递归调用,需要注意使用的是strNextLine变量值
-
}else{
-
readFinish(input, raf, currentIndex, skipSize); //完成
-
}
-
}
-
}else{
-
loopReadFile(input, raf, currentIndex, ++skipSize, raf.readLine()); //递归调用
-
}
-
} catch (IOException e) {
-
readFinish(input, raf, currentIndex, skipSize); //出现异常时,进行处理
-
throw new ReadException(e);
-
}
-
-
return notifySize;
-
}
-
-
/**
-
* 读取完成
-
* @param input 输入项
-
* @param raf RandomAccessFile对象
-
* @param currentIndex 当前行索引
-
* @param skipSize 跳过数量
-
* @return
-
*/
-
private void readFinish(INPUT input, RandomAccessFile raf, int currentIndex, int skipSize){
-
try {
-
notify.readFinish(input, ++currentIndex, notifySize, ++skipSize);
-
raf.close();
-
} catch (IOException e) {
-
throw new ReadException(e);
-
}
-
}
折腾一天,其实只是为了观察者中,多了一个参数readNext,该参数可以标识出是否可以读取下一行,也就是标识出该行是否为文件{BANNED}最佳后一行。这样通过对观察者重写redLine方法,可以实现对首行,或者{BANNED}最佳后一行,可通过重写对其特殊处理。
比如一个文件内容如下:
begin
begin2
测试中文3
end4
end
我想对文件{BANNED}中国第一行的begin过滤掉,对文件{BANNED}最佳后一行为end过滤掉,不进行后续处理。那个通过改造,就可以实现。demo如下:
-
@Override
-
public void readLine(FileReadInput input, int index, int lineIndex, String data, boolean readNext) {
-
String mydata = data;
-
if(lineIndex == 1 && data.equals("begin")){
-
mydata = null;
-
}
-
-
if(data.equals("end") && !readNext){
-
mydata = null;
-
}
-
-
super.readLine(input, index, lineIndex, mydata, readNext); //调用原始方法,进行mydata变更后的数据传递
-
}
阅读(2866) | 评论(0) | 转发(0) |