Замените строку на 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();
  }

Но он уничтожает мой текстовый файл и добавляет какой-то странный символ в начало строки и переводит следующую строку в конец строки. Почему это?


person Ehsan    schedule 23.12.2013    source источник
comment
Никогда не используйте пустые операторы catch. Кто знает, каких исключений вам не хватает. Пожалуйста, добавьте e.printStacktrace() и убедитесь, что ничего не печатается.   -  person Duncan Jones    schedule 23.12.2013
comment
Я добавляю, но проблема не здесь   -  person Ehsan    schedule 23.12.2013
comment
Что делает super(l)? Какой класс является родительским? Где вы вызываете saveFile() ? А почему вы записываете обратно в тот же файл, а не в отдельный файл?   -  person tuxdna    schedule 23.12.2013
comment
Привет Вам удалось решить эту проблему?   -  person user3769778    schedule 02.11.2019


Ответы (1)


Чтобы ответить на ваш вопрос: raf.writeUTF(newContents); «уничтожает ваш файл» и вызывает появление «странных символов». Вместо этого вы хотите использовать raf.writeBytes(newContents);

Кроме того, я не знаю, что должен делать этот код, но учтите, что вы не можете использовать RandomAcessFile для вставки строки в указанной позиции. Вместо этого ваш метод saveFile() перезаписывает начало каждой строки с помощью "my new contents here". Если и старая, и новая строка имеют одинаковую длину, это не проблема, но помимо этого это также портит ваш файл. Чтобы предотвратить это, перепишите файл с новым содержимым. Например. java заменить определенную строку в текстовом файле

person user3608078    schedule 25.08.2015