2011-12-19 22 views
17

Voglio sostituire il contenuto del file di seconda riga, qualcuno può aiutare per favore in base al formato di file e al metodo di ascolto sottostanti.Modifica del contenuto di file esistente in Java

1324254875443 
1313131 
Paid 
0.0 

La seconda riga è lunga e si desidera sostituire a 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 

risposta

27

Come proposto in the accepted answer a a similar question:

aprire un file temporaneo nella modalità di scrittura, allo stesso tempo, e per ogni linea, leggerlo, modificarlo se necessario, quindi scrivere nel file temporaneo. Al termine, eliminare l'originale e rinominare il file temporaneo.

Sulla base della sua implementazione, qualcosa di simile a:

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); 

    } 
} 
+0

non hai idea di come funzioni per te ?! dal momento che per me non crea nemmeno un file. Per risolvere il problema, creo una nuova analisi di FileWriter in un'istanza File anziché una stringa di nome file come fa questo codice. Quindi, ovviamente, sposta 'File newFile = new File (tmpFileName)' prima di creare il FileWriter e usa quell'istanza File per FileWriter. risolto per me. – buymypies

3

Posso suggerire di utilizzare la libreria Apache Commons IO. Lì troverai la classe org.apache.commons.io.FileUtils. Si può usare:

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

Questo codice legge intero contenuto del file in un List of String s e cambia il contenuto del secondo linea, poi scrive la lista indietro al file.

+0

quale libreria è in, non funziona, Elenco non è riconosciuto neanche. – user1106130

1

Non sono sicuro che leggere e scrivere lo stesso file contemporaneamente sia una buona idea. Penso che sarebbe meglio leggere il file riga per riga in un array String, sostituire la seconda riga e quindi scrivere l'array String nel file.

+0

sono sicuro che può essere fatto come sopra, ottengo il seguente errore? qualche idea? – user1106130

19

Anche se questa domanda è molto vecchia vorrei aggiungere che questo può essere raggiunto molto più facile dal momento che Java 1.7 con 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); 
+0

Grazie per questo suggerimento. È il 2017 e mi ero ancora affidato ai comuni io –

Problemi correlati