我必须使用该文件作为数据库,但我很困惑,如何将数据插入到文件中。复制文件并添加新数据然后重写新文件是非常愚蠢的。我注意到许多数据库已将数据存储到文件中,并且它们都是用C / C ++编写的。我想知道如何在Java中实现相同的功能。但我尝试了很多次,使用RandomAccessFile和FileChannel来插入数据。但它只是覆盖了我要插入的位置的数据。有些启发想法会有所帮助! 谢谢:)!
这是我写过的代码。但它覆盖了!覆盖!
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class Reader {
public static void main(String[] args) throws IOException {
new File("a.txt").createNewFile();
FileChannel fc = FileChannel.open(Paths.get("a.txt"),StandardOpenOption.WRITE);
ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put("one\ntwo\nthree\nfour\n".getBytes());
buf.flip();
fc.write(buf);
//set the pos to insert the data
//I want to insert the data after three the pos is 14
fc.position(14);
//clear the buf and add the new data
buf.clear();
buf.put("five\n".getBytes());
buf.flip();
fc.write(buf);
fc.close();
}
}
答案 0 :(得分:2)
没有简单的方法来"插入"文件中间的一行。文件系统和I / O子系统不会以这种方式工作。要真正插入一行,您必须复制文件,并在复制时在正确的位置添加该行。
你说" ...许多数据库都将数据存储到文件中......" - 这是真的,但他们用复杂的块级做到了它们在磁盘上维护块链并更新指针以使其看起来像插入行的技术。许多工作都是为了让所有这些对数据库用户透明。
甚至编写一个简单的数据库"可以在文件中间插入数据是一项重要的工作。
答案 1 :(得分:1)
您无法在文件中间插入。 C / C ++也不能这样做。
要插入文件中间,必须移动其余文件内容,以便为新数据腾出空间。
你必须做这样的举动。没有内置的API,即使在C / C ++中也没有。
数据库的数据文件很复杂,甚至不会在文件的中间中插入新数据。