我想读取一个包含M个连续双数的大型bin文件,它按预定顺序重复:
A0, A1, A2... AN, B0, B1, B2... BN... (M times)
我不允许立刻读取文件,因为文件太大,无法容纳主内存。因此,我使用类RandomAccessFile
和MappedByteBuffer
来分割文件(通道)。鉴于我知道每个继承中的数字(N),但我不知道成功总数(M),我想知道以下情况的最佳做法是什么:
1)保存数据的最佳方法是什么?我使用List<List<Double>>
因为我认为Map不能提供灵活性(这会太慢)来解决这个问题?我是对的吗?
2)确定到达文件末尾并停止算法的方法是什么?
以下是我编写的代码:
public void parseFile() throws IOException{
RandomAccessFile raf = new RandomAccessFile(file, "r");
long pos = raf.getFilePointer();
while((pos = raf.getFilePointer()) != -1){
parseDataSets(pos, 20);
}
raf.close();
}
private void parseDataSets(long pos, long size)
throws IOException {
List<List<Double>> valuesSet = new ArrayList<List<Double>>();
mbb = raf.getChannel().map(FileChannel.MapMode.READ_ONLY, pos,
size * 8 * numberOfSignals);
for (int i = 0; i < size; i++) {
for (int j = 0; j < numberOfSignals; j++) {
if (valuesSet.get(j) == null)
valuesSet.set(j, new ArrayList<Double>());
if (j == 0)
valuesSet.get(j).add((double) mbb.getDouble());
else
valuesSet.get(j).add(mbb.getDouble());
}
}
}
我认为方法parseDataSets
中需要一个while循环来检查文件的结尾是否提前到达(如果最后一个切片包含少于20个继承)。
更新:每个继承的第一个数字很长,而不是两个,因此parseDataSets
方法中的if-else检查。