问题
在项目中需要随机读取LZO压缩文件。经测试在本地,如果是顺序读取一个lzo压缩文件是没有问题的。但是如果想从一个文件的多个随机位置开始读取一行数据的话,还是容易出问题。最后的妥协方案是,每次随机读取一个偏移位置,就打开一次文件流。同时,以下是关键代码:
FSDataInputStream in= fs.open(new Path(fileName));
lzoIn=new LzopInputStream(in, new LzopDecompressor(lzoBufferSize), lzoBufferSize);
//由于InputStream的skip方法不保证能全部跳过指定字节数,需要自己实现
while(skipPos>0){
long actualSkip;
try {
actualSkip = lzoIn.skip(skipPos);
if(actualSkip==-1)
{
break;
}
skipPos=skipPos-actualSkip;
} catch (IOException e) {
LOGGER.error("随机读LZO错误:",e);
}
}
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(lzoIn));
String line;
try {
line = bufferReader.readLine();
dataList.add(line);
} catch (IOException e) {
LOGGER.error(e.getMessage(),e);
}
if(null != lzoIn) {
try {
lzoIn.close();
} catch (IOException e) {
LOGGER.error("RandomReadDataFormLzoFileTask error",e);
}
}