如何向RandomAccessFile追加内容?每次运行代码时,数据都会被覆盖。

4

如何使用这段代码追加数据?每次运行代码时,数据总是被覆盖。

    try{
        RandomAccessFile fileWriter = new RandomAccessFile("Officers.txt", "rw");

        fileWriter.writeUTF(officerObject.getOfficerBadgeNum());
        fileWriter.writeUTF(officerObject.getOfficerFirstName());
        fileWriter.writeUTF(officerObject.getOfficerLastName());
        fileWriter.writeUTF(officerObject.getOfficerPrecint());

        fileWriter.close();
        System.out.println("Data Successfully Saved");
    }
    catch (IOException e) {
        System.out.println("Error in File. Could not SAVE Officer");
        e.printStackTrace();
    }
3个回答

5
在开始编写之前,需要使用seek函数将文件指针定位到文件末尾,并先调用length函数。同时,建议使用try-with-resources语句来确保资源的正确关闭。例如:
try (RandomAccessFile fileWriter = new RandomAccessFile("Officers.txt", "rw")) {
    fileWriter.seek(fileWriter.length());
    fileWriter.writeUTF(officerObject.getOfficerBadgeNum());
    fileWriter.writeUTF(officerObject.getOfficerFirstName());
    fileWriter.writeUTF(officerObject.getOfficerLastName());
    fileWriter.writeUTF(officerObject.getOfficerPrecint());
    System.out.println("Data Successfully Saved");
} catch (IOException e) {
    System.out.println("Error writing File. Could not SAVE Officer");
    e.printStackTrace();
}

2
RandomAccessFile的作用是在文件中以随机位置访问数据。为了实现这个目的,有一个内部指针确定下一组字节将写到哪里。该指针默认为0。
因此,正如其他人所写,首先必须寻找文件的末尾;否则,您的写入将在该文件的开头处进行。
但是真正的问题在于:根据您的要求,您可能不需要使用RandomAccessFile。当您只想追加到该文件时,一个简单的FileWriter就可以胜任工作。当然,当您的主要需求是进行“容易”的UTF8编写时,RandomAccessFile可能是您的首选。
您看,创建普通的FileWriter对象时,有一个布尔标志来决定FileWriter是否应该创建新文件还是附加到现有文件中。

1
我希望能够得到对于我的回答被踩的评论,因为我真的看不出来问题在哪里。 - GhostCat
同意,但如果他使用FileWriter,就不能使用writeUTF() - user207421
FileWriter 几乎总是错误的选择,因为它总是使用默认编码。此外,请注意 writeUTF 并不仅仅将字符串写成 UTF-8;它还会在字符串前面添加长度;相当的操作应该是 DataOutputStream.writeUTF - kdgregory
谢谢。这些解释比那个没有注释的踩票要好得多。以后可能会进一步完善答案。 - GhostCat

0

在文件末尾添加skipBytes()如下:

尝试以下操作:

RandomAccessFile fileWriter = new RandomAccessFile("Officers.txt", "rw");

        fileWriter.writeUTF(officerObject.getOfficerBadgeNum());
fileWriter.skipBytes( (int)fileWriter.length() );
        fileWriter.writeUTF(officerObject.getOfficerFirstName());
.
.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接