Java在给定位置将字节插入文件而不覆盖任何数据

时间:2018-03-23 04:19:59

标签: java list insert filechannel

我有一个由(其中包括)FileChannel(相对较大的文件)支持的List,允许对对象进行随机读取。 get()size()add()的实施相当简单。但是,任何remove()set()调用都会委托给close()调用,其中会生成正确的临时文件,然后移动到原始路径。这最多占用2 * n磁盘空间。我想通过动态调整基础文件的大小来避免这种情况,以便进行现场编辑。

我有一个解决方案,但我想知道是否有人能想到更优雅的解决方案。 我想强调一点,我根本不需要编译代码。我只想知道是否有更优雅的解决方案,如果有,语言无关的理论就可以正常工作。

我建议的解决方案可能会在每个set()remove()上重写整个文件(如果突变发生在集合的开头附近);这似乎效率低下。有没有办法解决这个问题,还是我陷入了众所周知的磁盘空间(写出一个临时文件)和磁盘使用的困难之处(可能会为每个突变重写整个文件)?

void swap(long srcPos, long destPos, int nBytes) { //enables "bubbling" of bytes. Just like bubblesort. 
    ... //Have this implemented, can share in an edit if needed
}

E remove(int index) {
    //Bubble out the element to the end of file using swap(), then truncate
}

E set(int index, E element) {
    ... //Get element at index, and defines oldSize and NewSize
    if(oldSize == newSize) {
        //Sizes match, no bubbling required.
        //Replace bytes directly.
    } else if(oldSize < newSize) {
        //Old size is less than new size
        //Replace bytes directly, then bubble out difference and truncate
    } else if(oldSize > newSize) {
        //Old size is greater than new size
        //Grow file by difference
        //Bubble in zeros from end of file to position
        //Replace bytes directly
    }
}

1 个答案:

答案 0 :(得分:0)

我认为可以使用RandomAccessFile

实现类似的功能

您可以查看文档和一些示例。 步骤将类似于

  1. 以rw模式打开文件(读写)
  2. 使用搜索方法进入您将开始编写的文件位置
  3. 写字节
  4. 不要忘记关闭已打开的资源!