我有一个由(其中包括)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
}
}
答案 0 :(得分:0)
我认为可以使用RandomAccessFile
实现类似的功能您可以查看文档和一些示例。 步骤将类似于