2012-12-06 15 views
5

Chcę usunąć pewną zawartość pliku przy użyciu programu java, jak poniżej. Jest to metoda zapisu do zastąpienia w tym samym pliku lub powinna zostać skopiowana do innego pliku.Modyfikuj zawartość pliku za pomocą Java

Ale usunięcie całej zawartości pliku.

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

Myślę, że powinieneś używać nazwy br tylko raz;) – acostache

+0

1) zamknij czytnik po użyciu: 'br.close()'; 2) Co to jest "out" w swoim kodzie? 3) jaki jest rezultat, czego się spodziewałeś? – Andy

Odpowiedz

11

Chciałbym zacząć od zamknięcia czytelnika i pisarza spłukiwania:

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 Nie mogę znaleźć żadnego 'writeline' w' BufferWriter' również 'Close' powinno być małe. –

2

Upewnij się, że:

  • close każdy strumień, gdy nie są już potrzebne im
  • W szczególności przed ponowne otwarcie go na piśmie.
  • truncate plik, aby się upewnić, że kurczy się, jeśli napiszesz mniej niż miało to miejsce.
  • następnie wpisz dane wyjściowe
  • napisz poszczególne linie, nie polegaj na toString.
  • flush i close po zakończeniu pisania!

Jeśli używasz buforowane IO, zawsze trzeba upewnić się, że bufor jest opróżniany na koniec, czy może dojść do utraty danych!

+0

pomoc z kodem –

+0

Nie jestem pewien, czy czyta/pisze w tym samym czasie. Czyta linie na liście, a następnie zapisuje listę do pliku lub przynajmniej próbuje. – Qwerky

3

Odczyt i zapis do tego samego pliku symulacyjnie nie jest OK.

EDYCJA: w celu ponownego sformułowania i być bardziej poprawne i szczegółowe - czytanie i pisanie do tego samego pliku, w tym samym wątku, bez właściwego zamknięcia czytnika (i przeplatania pisarza) nie jest w porządku.

+1

Proszę wyjaśnić, dlaczego? –

+1

Tak, ogólnie rzecz biorąc, powodem może być to, że przesunięcia w pliku będą przesuwać się za każdym razem, gdy napiszesz, a kursor odczytu nie będzie tego śledził (patrz akceptowana odpowiedź tutaj: http://stackoverflow.com/questions/ 4251058/java-read-and-write-a-file-together). Mimo to, po ponownym przeczytaniu tego pytania, problem tutaj nie był (odpowiedziałem za szybko), ale kwestia nie zamykania się i nie kończenia. – acostache

0

Widzę trzy problemy.

Najpierw piszesz do out, który zakładam, że jest System.out, a nie strumieniem wyjściowym do pliku.

Po drugie, jeśli napiszesz do strumienia wyjściowego do pliku, musisz go zamknąć.

Po trzecie, metoda na urządzeniu ArrayList nie będzie zapisywać pliku, tak jak się spodziewasz. Przeprowadź pętlę nad listą i napisz po kolei każdą z nich. Zadaj sobie pytanie, czy musisz również pisać znaki nowej linii.

7

Zaakceptowanych odpowiedź jest wielki. Istnieje jednak prostszy sposób, aby zastąpić zawartość pliku przy użyciu commons-io biblioteki Apache (commons-io-2.4.jar - można używać najnowszych wersji)

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

Uwaga: Wyrzucone IOException musi być złowione i poddane obróbce przez zastosowanie odpowiednio .

0

Przyjęta odpowiedź jest nieco błędna. Oto poprawny kod.

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

Czy możesz powiedzieć, dlaczego zaakceptowana odpowiedź jest błędna? –

+1

Tak. "out.close()" powinno być poza pętlą "for". –

+0

Jest poza pętlą for. Pętla 'for' jest tylko następnym wierszem, ponieważ zostały wyemitowane nawiasy klamrowe. Zostawiłeś to poza blokiem 'try'. Lepszym rozwiązaniem byłoby umieszczenie czytelników wewnątrz 'przy użyciu bloków {...}' –