读取一个大的bin文件

时间:2013-05-07 14:01:16

标签: java file list randomaccessfile

我想读取一个包含M个连续双数的大型bin文件,它按预定顺序重复:

A0, A1, A2... AN, B0, B1, B2... BN... (M times)

我不允许立刻读取文件,因为文件太大,无法容纳主内存。因此,我使用类RandomAccessFileMappedByteBuffer来分割文件(通道)。鉴于我知道每个继承中的数字(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检查。

0 个答案:

没有答案