2012-12-06 15 views
5

Desidero eliminare alcuni contenuti del file utilizzando il programma java come di seguito. È questo il metodo di scrittura da sostituire nello stesso file o dovrebbe essere copiato in un altro file.Modificare il contenuto di un file utilizzando Java

Ma sta eliminando tutto il contenuto del file.

class FileReplace 
{ 
    ArrayList<String> lines = new ArrayList<String>(); 
    String line = null; 
    public void doIt() 
    { 
     try 
     { 
      File f1 = new File("d:/new folder/t1.htm"); 
      FileReader fr = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fr); 
      while (line = br.readLine() != null) 
      { 
       if (line.contains("java")) 
        line = line.replace("java", " "); 
       lines.add(line); 
      } 
      FileWriter fw = new FileWriter(f1); 
      BufferedWriter out = new BufferedWriter(fw); 
      out.write(lines.toString()); 
     } 
     catch (Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    public statc void main(String args[]) 
    { 
     FileReplace fr = new FileReplace(); 
     fr.doIt(); 
    } 
} 
+0

penso che dovresti usare il nome solo una volta;) – acostache

+0

1) chiudi il lettore dopo l'uso: 'br.close()'; 2) cosa è 'out' nel tuo codice? 3) qual è il risultato, cosa ti aspettavi? – Andy

risposta

11

Vorrei iniziare con la chiusura lettore, vampate di calore e scrittore:

public class FileReplace { 
    List<String> lines = new ArrayList<String>(); 
    String line = null; 

    public void doIt() { 
     try { 
      File f1 = new File("d:/new folder/t1.htm"); 
      FileReader fr = new FileReader(f1); 
      BufferedReader br = new BufferedReader(fr); 
      while ((line = br.readLine()) != null) { 
       if (line.contains("java")) 
        line = line.replace("java", " "); 
       lines.add(line); 
      } 
      fr.close(); 
      br.close(); 

      FileWriter fw = new FileWriter(f1); 
      BufferedWriter out = new BufferedWriter(fw); 
      for(String s : lines) 
       out.write(s); 
      out.flush(); 
      out.close(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static void main(String args[]) { 
     FileReplace fr = new FileReplace(); 
     fr.doIt(); 
    } 
} 
+1

-1 Non riesco a trovare alcun 'writeline' in' BufferWriter' anche 'Chiudi' dovrebbe essere in minuscolo. –

2

Assicurarsi di:

  • close qualsiasi flusso quando non è più necessario li
  • In particolare prima riapertura per la scrittura.
  • truncate il file, per assicurarsi che si riduca se scrivi meno di quello che aveva.
  • quindi scrivere l'uscita
  • scrivere singole righe, non fare affidamento su toString.
  • flush e close quando hai finito di scrivere!

Se si utilizza tamponata IO, devi sempre garantire che il buffer viene lavata alla fine, oppure si potrebbero perdere i dati!

+0

aiuto con il codice –

+0

Non sono sicuro che stia leggendo/scrivendo allo stesso tempo. Legge le righe in un elenco, quindi scrive l'elenco in un file o almeno lo sta tentando. – Qwerky

3

Leggere + scrivere sullo stesso file simulatamente non è ok.

MODIFICA: per riformulare ed essere più corretti e specifici - leggere e scrivere sullo stesso file, nello stesso thread, senza chiudere correttamente il lettore (e flussare lo scrittore) non va bene.

+1

Potresti per favore spiegare perché? –

+1

Sì, in generale, un motivo potrebbe essere perché gli offset all'interno del file si spostano ogni volta che si effettua una scrittura e il cursore di lettura non ne terrà traccia (vedere la risposta accettata qui: http://stackoverflow.com/questions/ 4251058/java-lettura-e-scrivere-a-file-insieme). Eppure, dopo aver riletto questa domanda, il problema qui non era quello (ho risposto troppo velocemente), ma una questione di non chiusura e di fluttuante. – acostache

0

Posso vedere tre problemi.

Prima si sta scrivendo a out che presumo sia System.out, non un flusso di output del file.

In secondo luogo, se si scrive su un flusso di output sul file, è necessario chiuderlo.

In terzo luogo, il metodo toString() su un ArrayList non sta per scrivere il file come ci si aspetta. Passa sopra l'elenco e scrivi ogni String uno alla volta. Chiediti se è necessario scrivere anche caratteri di nuova riga.

7

La risposta accettata è grande. Tuttavia, c'è un modo più semplice per sostituire il contenuto in un file utilizzando commons-io biblioteca di Apache (commons-io-2.4.jar - è possibile utilizzare qualsiasi ultime versioni)

private void update() throws IOException{ 
     File file = new File("myPath/myFile.txt"); 
     String fileContext = FileUtils.readFileToString(file); 
     fileContext = fileContext.replaceAll("_PLACEHOLDER_", "VALUE-TO-BE-REPLACED"); 
     FileUtils.write(file, fileContext); 
} 

Nota: scagliati IOException ha bisogno di essere catturati e manipolati dall'applicazione di conseguenza .

0

La risposta accettata è leggermente errata. Ecco il codice corretto.

public class FileReplace { 
List<String> lines = new ArrayList<String>(); 
String line = null; 

public void doIt() { 
    try { 
     File f1 = new File("d:/new folder/t1.htm"); 
     FileReader fr = new FileReader(f1); 
     BufferedReader br = new BufferedReader(fr); 
     while ((line = br.readLine()) != null) { 
      if (line.contains("java")) 
       line = line.replace("java", " "); 
      lines.add(line); 
     } 
     fr.close(); 
     br.close(); 

     FileWriter fw = new FileWriter(f1); 
     BufferedWriter out = new BufferedWriter(fw); 
     for(String s : lines) 
      out.write(s); 
     out.flush(); 
       } 
     out.close(); 
    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 
+0

Puoi dire perché la risposta accettata è sbagliata? –

+1

Sì. "out.close()" dovrebbe essere fuori dal ciclo "for". –

+0

È al di fuori del ciclo for. Il ciclo 'for' è solo la riga successiva, poiché le parentesi sono state emesse. L'hai messo fuori dal blocco 'try'. Una soluzione migliore sarebbe stata quella di mettere i lettori all'interno di 'usando {...}' blocchi –

Problemi correlati