Java 读取一个大的bin文件
我想读取一个大的bin文件,其中包含M个连续的双倍数字,这些数字按预定义顺序重复,如下所示: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) 保存数据的最佳方式是什么?我使用了一个列表,因为
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个