Java 随机存取文件的位移位

Java 随机存取文件的位移位,java,bit-shift,randomaccessfile,Java,Bit Shift,Randomaccessfile,我需要将文件指针右边的RandomAccessFile中的所有内容向右移四个字节,以便在文件指针处写入一个整数 这将不会编译: raf >> 16; 我打算使用readFully,它从指针开始读取RAF中的字节,然后再从指针开始读取,但这会将它们读入数组,项目的一个限制是我们不能使用数组 我该怎么做呢?因为您的目标是对整数进行排序并将其存储在文件中,所以可能值得一试 MapDB提供由磁盘存储支持的并发映射、集合和队列 或堆外内存。它是一个快速的嵌入式Java数据库引擎,具有 Apa

我需要将文件指针右边的RandomAccessFile中的所有内容向右移四个字节,以便在文件指针处写入一个整数

这将不会编译:

raf >> 16;
我打算使用readFully,它从指针开始读取RAF中的字节,然后再从指针开始读取,但这会将它们读入数组,项目的一个限制是我们不能使用数组


我该怎么做呢?

因为您的目标是对整数进行排序并将其存储在文件中,所以可能值得一试

MapDB提供由磁盘存储支持的并发映射、集合和队列 或堆外内存。它是一个快速的嵌入式Java数据库引擎,具有 Apache许可证


由于您的目标是对整数进行排序并将其存储在文件中,因此可能值得一试

MapDB提供由磁盘存储支持的并发映射、集合和队列 或堆外内存。它是一个快速的嵌入式Java数据库引擎,具有 Apache许可证

A处理一个物理文件,它从一个文件读写

不能只在一个位置插入字节。必须移动、复制位置后的所有字节,以便为要插入的值留出空间

最有效的方法是将剩余数据读入数组,插入并写入新值,然后写回数组。但你说这是不允许的

或者,您必须使用循环(例如for)对字节进行迭代,并将它们写回您要插入的更大位置:+4字节

假设文件长度和当前位置是4字节的倍数,这符合您的需要,下面是一个示例:

public static void insert(RandomAccessFile raf, int dataToInsert)
                      throws IOException {

    // First remember insertion position:
    long insPos = raf.getFilePointer();

    // Next copy all data from this pos. For easier, go downward:
    raf.seek(raf.length() - 4);

    for (long pos = raf.getFilePointer(); pos >= insPos; pos -= 4) {
        // readInt() and writeInt() implicitly moves the file pointer
        raf.writeInt(raf.readInt());
        raf.seek(pos - 4);
    }

    // Copy done, insert new value:
    raf.seek(insPos);
    raf.writeInt(dataToInsert);
}
示例用法 输入:

输出:

A处理一个物理文件,它从一个文件读写

不能只在一个位置插入字节。必须移动、复制位置后的所有字节,以便为要插入的值留出空间

最有效的方法是将剩余数据读入数组,插入并写入新值,然后写回数组。但你说这是不允许的

或者,您必须使用循环(例如for)对字节进行迭代,并将它们写回您要插入的更大位置:+4字节

假设文件长度和当前位置是4字节的倍数,这符合您的需要,下面是一个示例:

public static void insert(RandomAccessFile raf, int dataToInsert)
                      throws IOException {

    // First remember insertion position:
    long insPos = raf.getFilePointer();

    // Next copy all data from this pos. For easier, go downward:
    raf.seek(raf.length() - 4);

    for (long pos = raf.getFilePointer(); pos >= insPos; pos -= 4) {
        // readInt() and writeInt() implicitly moves the file pointer
        raf.writeInt(raf.readInt());
        raf.seek(pos - 4);
    }

    // Copy done, insert new value:
    raf.seek(insPos);
    raf.writeInt(dataToInsert);
}
示例用法 输入:

输出:


你想做什么?在读取文件时是否要在两者之间插入一个整数?是,这是一个二进制插入。用户输入一个数字,程序将其按升序插入文件的正确位置。您想做什么?在读取文件时是否要在两者之间插入一个整数?是,这是一个二进制插入。用户输入一个数字,程序将其按升序插入文件的正确位置。感谢您的回答,但使用RandomAccessFile是项目要求的一部分。感谢您的回答,但使用RandomAccessFile是项目要求的一部分。非常感谢,这帮助我完成了项目。教授确实在课堂上提到我们应该使用一点移位,但这不是一个要求,所以这一切都很好。我正在处理超过40Gb的非常大的文件声音文件,我想移位内容,添加额外的元数据,但迭代文件中数十亿个字节的每个字节,似乎计算成本非常高,没有什么可以帮助解决这件事的吗?比如批量转移之类的?这个答案很有帮助nonetheless@ManelPereira你当然能做到。例如,如果您知道要插入100个字节,请将文件扩展为100个字节,并从末尾开始复制内容。例如,读取最后1 MB,并将其复制到更高位置100字节。然后在最后一个之前1 MB,依此类推,直到到达要插入的位置。@icza哦,我明白了。。。这样我就避免了读取每个字节,非常感谢Hanks,这帮助我完成了这个项目。教授确实在课堂上提到我们应该使用一点移位,但这不是一个要求,所以这一切都很好。我正在处理超过40Gb的非常大的文件声音文件,我想移位内容,添加额外的元数据,但迭代文件中数十亿个字节的每个字节,似乎计算成本非常高,没有什么可以帮助解决这件事的吗?比如批量转移之类的?这个答案很有帮助nonetheless@ManelPereira你当然能做到。例如,如果您知道要插入100个字节,请将文件扩展为100个字节,并从末尾开始复制内容。例如,读取最后1 MB,并将其复制到更高位置100字节。然后在最后一个之前1 MB,依此类推,直到到达要插入的位置。@icza哦,我明白了。。。这样我可以避免读取每个字节,非常感谢
123456789012
1234ABCD56789012