Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取一个大的bin文件_Java_File_List_Randomaccessfile - Fatal编程技术网

Java 读取一个大的bin文件

Java 读取一个大的bin文件,java,file,list,randomaccessfile,Java,File,List,Randomaccessfile,我想读取一个大的bin文件,其中包含M个连续的双倍数字,这些数字按预定义顺序重复,如下所示: A0, A1, A2... AN, B0, B1, B2... BN... (M times) 我不允许立即读取该文件,因为该文件可能太大,无法容纳主内存。因此,我使用类RandomAccessFile和MappedByteBuffer将文件划分为片(通道)。鉴于我知道每个继任者的人数(N),但我不知道成功总数(M),我想知道以下情况的最佳做法: 1) 保存数据的最佳方式是什么?我使用了一个列表,因为

我想读取一个大的bin文件,其中包含M个连续的双倍数字,这些数字按预定义顺序重复,如下所示:

A0, A1, A2... AN, B0, B1, B2... BN... (M times)
我不允许立即读取该文件,因为该文件可能太大,无法容纳主内存。因此,我使用类
RandomAccessFile
MappedByteBuffer
将文件划分为片(通道)。鉴于我知道每个继任者的人数(N),但我不知道成功总数(M),我想知道以下情况的最佳做法:

1) 保存数据的最佳方式是什么?我使用了一个
列表
,因为我认为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());
                }
            }

    }
public void parseFile()引发IOException{
RandomAccessFile raf=新的RandomAccessFile(文件“r”);
long pos=raf.getFilePointer();
而((pos=raf.getFilePointer())!=-1){
分析数据集(pos,20);
}
raf.close();
}
专用数据集(长位置、长尺寸)
抛出IOException{
列表值set=new ArrayList();
mbb=raf.getChannel().map(FileChannel.MapMode.READ_ONLY,pos,
尺寸*8*信号数量);
对于(int i=0;i
我认为在方法
parseDataSets
中需要一个while循环来检查文件的结尾是否提前到达(如果最后一个片段包含少于20个序列)


更新:每个序列的第一个数字都很长,而不是两倍,因此if-else检查
parseDataSets
方法。

如果文件不适合内存,我认为生成的值数组也不适合(或者,至少它会很大)。大约2MB.getLong()将引发BufferUnderflowException-如果此缓冲区中剩余的字节少于8个