Изменение существующего содержимого файла в Java - PullRequest
21 голосов
/ 19 декабря 2011

Я хочу заменить содержимое файла второй строки, может кто-нибудь помочь, пожалуйста, на основе приведенного ниже формата файла и метода прослушивателя.

1324254875443
1313131
Paid
0.0

2-я строка длинная и ее необходимо заменить на currentTimeMillis().

/************** Pay Button Listener **************/
public class payListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {

        ArrayList<String> lines = new ArrayList<String>();
        String line = null;

        try {
            FileReader fr = new FileReader("Ticket/" + ticketIDNumber + ".dat");
            BufferedReader br = new BufferedReader(fr);
            FileWriter fw = new FileWriter("Ticket/" + ticketIDNumber + ".dat");
            BufferedWriter bw = new BufferedWriter(fw);
            while ((line = br.readLine()) != null) {
                if (line.contains("1313131"))
                    line.replace(System.currentTimeMillis();
                lines.add(line);
                bw.write(line);
            }  //end if                 

        }     //end try
        catch (Exception e) {

        }  //end catch   
    }    //end while
}//end method

Ответы [ 4 ]

29 голосов
/ 19 декабря 2011

Как предложено в принятом ответе на аналогичный вопрос :

одновременно открыть временный файл в режиме записи и для каждой строки прочитать его, при необходимости изменить, а затем записать во временный файл. В конце удалите оригинал и переименуйте временный файл.

На основе вашей реализации, что-то похожее на:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class ReplaceFileContents {
   public static void main(String[] args) {
     new ReplaceFileContents().replace();
   }

   public void replace() {
      String oldFileName = "try.dat";
      String tmpFileName = "tmp_try.dat";

      BufferedReader br = null;
      BufferedWriter bw = null;
      try {
         br = new BufferedReader(new FileReader(oldFileName));
         bw = new BufferedWriter(new FileWriter(tmpFileName));
         String line;
         while ((line = br.readLine()) != null) {
            if (line.contains("1313131"))
               line = line.replace("1313131", ""+System.currentTimeMillis());
            bw.write(line+"\n");
         }
      } catch (Exception e) {
         return;
      } finally {
         try {
            if(br != null)
               br.close();
         } catch (IOException e) {
            //
         }
         try {
            if(bw != null)
               bw.close();
         } catch (IOException e) {
            //
         }
      }
      // Once everything is complete, delete old file..
      File oldFile = new File(oldFileName);
      oldFile.delete();

      // And rename tmp file's name to old file name
      File newFile = new File(tmpFileName);
      newFile.renameTo(oldFile);

   }
}
25 голосов
/ 17 марта 2016

Несмотря на то, что этот вопрос очень старый, я хотел бы добавить, что этого можно добиться намного проще, поскольку Java 1.7 с java.nio.file.Files:

List<String> newLines = new ArrayList<>();
for (String line : Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8)) {
    if (line.contains("1313131")) {
       newLines.add(line.replace("1313131", ""+System.currentTimeMillis()));
    } else {
       newLines.add(line);
    }
}
Files.write(Paths.get(fileName), newLines, StandardCharsets.UTF_8);
3 голосов
/ 19 декабря 2011

Я мог бы предложить использовать Apache Commons IO библиотеку.Там вы найдете класс org.apache.commons.io.FileUtils .Вы можете использовать его:

File file = new File("... your file...");
List<String> lines = FileUtils.readLines(file);
lines.set(1, ""+System.currentTimeMillis());
FileUtils.writeLines(file, lines);

Этот код считывает все содержимое файла в List of String s и изменяет содержимое второй строки, затем записывает список обратно в файл.

1 голос
/ 19 декабря 2011

Я не уверен, что чтение и запись одного и того же файла одновременно - это хорошая идея. Я думаю, что было бы лучше прочитать файл построчно в массив String, заменить вторую строку и затем записать массив String обратно в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...