# Java -  Zeile aus Text datei löschen



## Jannis96 (13. Jan 2015)

Guten Tag, ich habe ein Programm geschrieben das Daten in eine txt schreibt.

Nun schreibe ich ein zweites Programm was bestimmte zeilen aus der txt löschen soll. Also was muss ich da machen damit ich die Zeilen löschen kann? Ich habe die Zeilen schon ausgelesen..


```
import java.io.*;

public class Entferner {
  public static void main(String[] args) throws IOException {
    
    FileReader fr = new FileReader("Pinger.txt");
    BufferedReader br = new BufferedReader(fr);
    
    String zeile1 = br.readLine();
    String zeile2 = br.readLine();
    String zeile3 = br.readLine();
    String zeile4 = br.readLine();
    
    
    if (zeile2.equals(zeile4)) {
     
    } // end of if
    
    
    br.close();
```


----------



## Joose (13. Jan 2015)

Simpler Ansatz:
Die Datei einfach neu schreiben lassen ohne der zu löschenden Zeile.
Um nicht die ganze Datei in den Speicher zu lesen reicht es vollkommen aus eine temporäre Datei zu erzeugen in welcher du alle Zeilen reinschreibst die du behalten willst.
Am Ende löscht du die alte Datei und benennst die temporäre Datei um.


----------



## Jannis96 (13. Jan 2015)

Bei dem ersten Programm werden alle 5 Sekunden 2 Zeilen in die txt geschrieben und ich möchte das wenn die beiden Einträge gleich sein sollten, dass einer gelöscht wird aber der andere in dieser txt erhalten wird, weil nach 5 sekunden wieder eine änderung dort eingetragen wird.


----------



## Joose (13. Jan 2015)

Ist das 1.Programm von dir oder ein "externes" Tool? Wenn deins, dann würde ich schon verhindern dass 2 gleiche Einträge geschrieben werden.

Gibt es Probleme wenn beide Zeilen stehen bleiben? Oder soll die doppelte Zeile lediglich wegen der Übersicht und dem Speicherplatz gelöscht werden?


----------



## Jannis96 (13. Jan 2015)

Also das andere Programm Ping einen Server an, alle 5 Sekunden. Dann steht in der txt untereinander:

13.01.2015 11:18:05
Ping war Erfolgreich
13.01.2015 11:18:10
Ping war Erfolgreich

.....dies würde sich immer fort führen. Nun möchte ich aber das dies nur einmal steht und sobald "Ping war nicht erfolgreich" kommt, dies auch einmal dort steht bis der Ping wieder erfolgreich ist.


Also immer die 2 zeile und 4 zeile vergleichen. Wenn die gleich sind möchte ich Zeile 1. und 2. löschen


----------



## Joose (13. Jan 2015)

Wie schon in dem 1.Thread zum gleichen/ähnlichen Problem: Speicher dir den Status ob der Ping erfolgreich war oder nicht.
Bei jedem neuen Ping vergleichst du die beiden, hat sich der Status geändert -> Zeile in Logdatei schreiben. Ist der Status aber gleich geblieben -> Zeile nicht schreiben.


----------



## Jannis96 (13. Jan 2015)

Ja aber wie?

Ich weiß nicht wie ich die vergleichen soll


----------



## Joose (13. Jan 2015)

Du bekommst doch beim Ping eine Antwort oder? Was bekommst du da? Ein Integer, ein boolean, ein String?


----------



## Jannis96 (13. Jan 2015)

String


 if (zeile2.equals(zeile4)) {

das was danach kommt, das brauche ich


----------



## Joose (13. Jan 2015)

Das können wir dir leider nicht sagen außer wir würden raten.

Du gibst uns eine Zeile Code. Sagst nicht dazu was wir uns unter "zeile2" bzw. "zeile4" vorstellen können.

Allgemein:
Du führst einen Ping aus und bekommst einen String als Rückgabewert.
Diesen filterst du auf die wichtige Information ob erfolgreich oder nicht.
Je nachdem setzt du ein (boolean) Flag/int(auch Enum)/String

Beim nächsten Ping filterst du wieder auf die wichtige Information, und überprüfst ob du einen anderen Wert bekommen hast
Wenn ja -> Zeile loggen
Wenn nein -> nichts tun.


```
String a = "";
PingStatus status = status.UNDEFINED;

// ping durchführen
if(a.equals("Erfolgreich")) {
   if(status != PingStatus.SUCCESS) {
      // zeile loggen
   }
} else {
   if(status != PingStatus.FAIL) {
      // zeile loggen
   }
}
```


----------



## Jannis96 (13. Jan 2015)

Ja die Rückgabe wird bei mir in dem String "result" gespeicher und enthält einfach alles wenn man selber einen Ping machen muss. Mit if "Empfangen = 1" weiß ich dann das er erfolgreich war und dann wird das auch so in die Log Datei geschrieben. Das ist ja die ganze Zeit mein Problem, ich weiß wie du es meinst aber kann es nicht richtig umsetzen


Wie filtere ich einen String, dann muss ich ihn ja auseinander nehmen, Wie?


----------



## Joose (13. Jan 2015)

Jannis96 hat gesagt.:


> Mit if "Empfangen = 1" weiß ich dann das er erfolgreich war



Da dieser Teil ist wichtig! Der würde meinem 

```
if(a.equals("Erfolgreich")) {
```
entsprechen.

Und was ich da lese funktioniert die Überprüfung ja schon ob der Status erfolgreich war oder nicht.
Da ich nicht weiß diese Überprüfung bei dir ausschaut, kann ich nur allgemein sagen wie ich es machen würde: Den Result String eben auf die wichtigen Informationen "filtern" (mittels contains oder substring oder ...)

Das Einzige was bei dir noch fehlt ist den alten Status zu speichern usw.
entsprechenden Code habe ich oben schon gepostet.



Jannis96 hat gesagt.:


> Wie filtere ich einen String, dann muss ich ihn ja auseinander nehmen, Wie?



Die Klasse String bietet da genügend Methoden an, einfach mal die Dokumentation kontrollieren


----------



## Jannis96 (13. Jan 2015)

Bin halt noch Anfänger aber hier mal der Script...



```
// Datum und Zeit
import java.text.DateFormat;
import java.util.Date;
import java.util.GregorianCalendar; 
 
// File Writer 
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter; 

//Console  
import java.io.*;
import java.util.*;

public class Pinger {
  public static void main(String[] args) throws IOException  {
    printGregorianCalendarDate();  
    Pinger ping = new Pinger();
    List<String> commands = new ArrayList<String>();
    // Consolen Befehle
    commands.add("ping");
    // Hier die IP Adresse eintragen
    //  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|               
    commands.add("192.168.55.176");     // |                
    //  ___________________________________|  
    commands.add("-n");
    commands.add("1");
    ping.doCommand(commands);   
  }
  // Zeit
  static void printGregorianCalendarDate() {
    GregorianCalendar now = new GregorianCalendar();
    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);   
    df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); 
    String zeit = (df.format(now.getTime()));
    PrintWriter ppWriter = null;
    try {
      ppWriter = new PrintWriter(new BufferedWriter(new FileWriter("Pinger.txt", true)));
      ppWriter.println(zeit)  ;
    } catch (IOException ioe) {
      ioe.printStackTrace();
    } finally {
      if (ppWriter != null){
        ppWriter.flush();
        ppWriter.close();
      }
    }   
  }
  // CMD
  public void doCommand(List<String> command) throws IOException {  
    String s = null;
    ProcessBuilder pb = new ProcessBuilder(command);
    Process process = pb.start();
    String result = getStringFromInputStream(process.getInputStream());  
    // Text
    if (result.contains("Empfangen = 1")) {  
      PrintWriter epWriter = null;
      try {
        epWriter = new PrintWriter(new BufferedWriter(new FileWriter("Pinger.txt", true)));
        epWriter.println("Ping war Erfolgreich")  ;
      } catch (IOException ioe) {
        ioe.printStackTrace();
      } finally {
        if (epWriter != null){
          epWriter.flush();
          epWriter.close();
        }
      } 
    }   // end of if  
    if (result.contains("Verloren = 1")) {
      PrintWriter vpWriter = null;
      try {
        vpWriter = new PrintWriter(new BufferedWriter(new FileWriter("Pinger.txt", true)));
        vpWriter.println("Ping war nicht Erfolgreich")  ;
      } catch (IOException ioe) {
        ioe.printStackTrace();
      } finally {
        if (vpWriter != null){
          vpWriter.flush();
          vpWriter.close();
        }
      } 
    } // end of if   
  }
  // --
  private static String getStringFromInputStream(InputStream is) {
    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();
    String line;
    try {
      br = new BufferedReader(new InputStreamReader(is));
      while ((line = br.readLine()) != null) {
        sb.append(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (br != null) {
        try {
          br.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return sb.toString(); 
  }
}
```


----------



## Joose (13. Jan 2015)

Jannis96 hat gesagt.:


> Bin halt noch Anfänger aber hier mal der Script...



In Java gibt es keine "Script"e, sondern Klasse und Methoden 
Aber das nur nebenbei



Jannis96 hat gesagt.:


> ```
> if (result.contains("Empfangen = 1")) {
> .........
> }   // end of if
> ...



Genau das ist der Teil den es anzupassen gilt: Wie siehe mein Beispiel Code oben
Du brauchst einfach eine Art "Flag" um dir den letzten Status zu merken.

Kleine Anmerkungen zum Code: 
In der Methode "doCommand" hast du 2x den gleichen Code stehen (um in das File zu schreiben), lagere den Teil in eine eigene Methode aus und rufe die stattdessen auf.
Außerdem kannst du aus dem "if { } .... if { }" ein "if else" machen, da der Ping entweder erfolgreich sein kann oder nicht


----------

