在java中更新文本文件的特定部分

时间:2010-10-03 09:23:24

标签: java text-files

在我的程序中,我需要在每次用户提取时更新文本文件的Balance列。我使用了write方法和append方法,但无济于事。 用户登录后,该特定行将存储在数组

#PIN AccountNo Balance
1598 01-10-102203-0 95000
4895 01-10-102248-0 45000
9512 01-10-102215-0 125000
6125 01-10-102248 85000

代码:

try{
    BufferedWriter out = new BufferedWriter(new FileWriter(".\\AccountInfo.txt",true));
    if (amount <= 0.0) {
        System.out.println("can only withdraw positive amount!");
        transactionScreen();
    }
    else if (this.balance >= amount) {
        if(amount>15000.0){
            System.out.println("The maximum amount allowed per transaction is only Rs.15000/=");
            transactionScreen();
        }
        else{
            this.balance -= amount;
            object.c=this.balance;
            String newBal=Double.toString(this.balance);
            out.write("");
            //out.append("");
            out.write(newBal);
            //out.append(newBal);
        }
    }
    else {
        System.out.println("not enough money in account!");
        transactionScreen();
    }
}
catch(IOException e){
    e.printStackTrace();
}

2 个答案:

答案 0 :(得分:6)

执行此操作的唯一简单方法是每次进行任何更改时都重写文本文件的全部内容。但由于以下几个原因,这很可怕:

  • 这很慢。
  • 一次只能由一个线程完成,因此不易扩展。
  • 如果您的应用程序在写入期间崩溃,您可能会丢失所有数据。

您可以使用固定宽度列来搜索和写入文件,而无需重写整个文件,但仍然存在问题:

  • 如果您需要存储超出列所需宽度的值,则表示您遇到问题。
  • 您仍需要读取整个文件(最差情况 - 平均一半)才能找到您想要修改的记录(在内存中保留缓存会有帮助)。

我建议你改用数据库。有些数据库可以在本地安装,不需要管理(例如SQLite)。

答案 1 :(得分:3)

将文件视为一张纸,上面写着一些东西。在写作结束时还剩下白纸,所以你可以附加任何你想要的东西。如果你想在中间改变一些东西,你可以删除一些文字并写下别的东西。但是,您只能使用删除的字母替换文本。你不能删除4个字母并写6个字母,根本就没有空格。因此,如果余额从900增加到1100,则文件中没有剩余空间。有一个额外的字母,除非重写文件的剩余部分,否则无法存储。

有时候如果你想在一张纸上换一些东西,就更容易得到一张白纸并复印原件,包括你想到的改变。这通常也是在更改文件时完成的。不是仅仅编写更改,而是在内存中准备更改的文件并将其写入原始文件。

Piece of paper