2010-10-03 63 views
1

在我的程序中,我需要在每次用户进行提款时更新文本文件的余额列。我同时使用了写入方法和附加方法,但无济于事。 一旦用户已登录,则该特定行被存储在数组中在java中更新文本文件的特定部分

#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(); 
} 

回答

6

唯一简单的方法来做到这一点是重写文本文件的全部内容每次你做任何改变。但是由于以下几个原因,这是非常糟糕的:

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

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

  • 如果你需要存储超过价值你的列所需的宽度,那么你有一个问题。
  • 你仍然需要读取整个文件(最坏的情况 - 平均一半)来找到你想要修改的记录(保持内存缓存在这里有帮助)。

我建议您使用数据库来代替。有些数据库可以在本地安装并且不需要管理(例如SQLite)。

+0

+1 - 为提示(正确地)数据库将是一个更好的主意。 – 2010-10-03 09:38:53

+0

我可以使用数据库,但不幸的是我需要仅使用记事本文件来完成此程序。所以,如果你可以,你可以给我的代码,我可以重新写整个文件的所有优势。谢谢 – Yoosuf 2010-10-03 09:39:56

+2

@Yoosuf:为什么你不能使用数据库?如果您需要将输出作为文本文件,则可以将其作为文本文件从数据库中导出。正如我所说,为什么不应该为此使用文本文件有很多原因,那么需求来自哪里呢?作为一名程序员,您有责任向您的客户指出他们的解决方案存在问题 - 特别是当它是账户余额等信息时。或者这是作业吗?那么我认为你应该问一些使用什么方法的提示,而不是要求我们为你写代码。 – 2010-10-03 09:44:04

3

考虑一个文件是写在纸上的一张纸。在写作结束时还剩下白纸,所以你可以追加任何你想要的东西。如果你想在中间改变一些东西,你可以擦除一些文字并写下其他的东西。但是,您只能用删除的字母替换文本。你无法擦除4个字母,也不能写出6个字母,因此没有空间。因此,如果余额从900增加到1100,则文件中没有剩余空间。有一个额外的字母,除非文件的其余部分被重写,否则无法存储。

有时,如果您想在纸上更改某些内容,可以更容易地获得一张空白纸并复制原件,包括您想要的更改。这通常也是在更改文件时完成的。而不是只写更改,更改的文件在内存中准备并写入原始文件。

Piece of paper

相关问题