用RandomAccessFile替换一行

时间:2013-12-23 15:26:59

标签: java io randomaccessfile

我有一个包含此内容的文本文件:

Ehsan,12345,11111,1000
maryam,147258,222,5000
reza,758694,abcd,4600
Ali,564789,kfcg,7500
mohammad,658932,bnfgd,5800
zahra,758964,798564,6750
rasool,568974,457832,1400
Ahmad,785403,wasd,6900
Amir,3205809,man123,7000
Morad,1,1,8900

我用RandomAccessFile阅读了它的所有内容:

Account2[] members = new Account2[10];
try {
  RandomAccessFile raf = new RandomAccessFile("d:\\myTxtFile.txt", "r");
  raf.seek(0);
  long position = raf.getFilePointer();
  int counter = 0;
  while(raf.length()> position){
    members[counter] = new Account2(raf.readLine(), position);
    position =raf.getFilePointer();
    counter++;
  }
} catch (Exception e) {
     e.printStackTrace();
}

然后在Account2我有一个方法可以在更改后保存文件:

private long position;
public Account2(String l, long p){
  super(l); 
  position = p;
}
public void saveFile(){
  try {
    RandomAccessFile raf = new RandomAccessFile("d:\\myTxtFile.txt", "rw");
    raf.seek(position);
    String newContents = "my new contents here";
    //raf.writeChars(newContents.toString());
    raf.writeUTF(newContents);
  } catch (Exception e) {
     e.printStackTrace();
  }

但它会破坏我的文本文件并在行首添加一些奇怪的字符并将下一行添加到行尾。这是为什么?

1 个答案:

答案 0 :(得分:1)

要回答您的问题:raf.writeUTF(newContents);正在“销毁您的文件”并导致“奇怪的字符”出现。相反,你想使用raf.writeBytes(newContents);

此外,我不知道此代码应该完成什么,但请考虑您不能在指定位置使用RandomAcessFile 插入字符串。相反,您的saveFile()方法会使用"my new contents here"覆盖每一行的开头。如果旧的和新的String都具有相同的长度,这不是问题,但除此之外,这也会弄乱你的文件。防止使用新内容重写您的文件。例如。 java replace specific string in textfile