2011-12-19 15 views
17

Quiero reemplazar el contenido del archivo de la segunda línea, alguien puede ayudarme por favor basándose en el siguiente formato de archivo y método de escucha.Modificación del contenido del archivo existente en Java

1324254875443 
1313131 
Paid 
0.0 

La segunda línea es larga y desea reemplazar 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 

Respuesta

27

como se propone en the accepted answer a a similar question:

abrir un archivo temporal en el modo de escritura al mismo tiempo, y para cada línea, leerla, modificarla si es necesario, a continuación, escribir en el archivo temporal. Al final, elimine el original y cambie el nombre del archivo temporal.

En función de su aplicación, algo similar 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

sin idea de cómo funcionó esto para ti ?! ya que para mí ni siquiera crea un archivo. Para solucionarlo, creo un nuevo análisis de FileWriter en una instancia de archivo en lugar de una cadena de nombre de archivo como este código. Así que obviamente mueva 'File newFile = new File (tmpFileName)' antes de crear el FileWriter y use esa instancia de File para FileWriter. me lo arregló – buymypies

3

que podría sugerir el uso Apache Commons IO biblioteca. Allí encontrarás la clase org.apache.commons.io.FileUtils. Se puede utilizar:

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

Este código lee el contenido del archivo entero en una List of String s y cambia el contenido de la segunda línea, a continuación, escribe la lista de nuevo al archivo.

+0

qué biblioteca está en, no está funcionando, la lista tampoco es reconocida. – user1106130

1

No estoy seguro de que leer y escribir el mismo archivo simultáneamente sea una buena idea. Creo que sería mejor leer el archivo línea por línea en una matriz String, reemplazar la segunda línea y luego escribir la matriz String en el archivo.

+0

estoy seguro de que se puede hacer como arriba, me sale el siguiente error? ¿algunas ideas? – user1106130

19

Aunque esta pregunta es muy antiguo que me gustaría añadir que esto se puede lograr mucho más fácil ya que 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

Gracias por este consejo. Es 2017 y todavía había estado confiando en bienes comunes io –

Cuestiones relacionadas