# .txt Datei Zeile löschen.



## IceHawk (11. Jan 2013)

Hallo,

ich versuche gerade aus eine eingelesenen .txt Datei ein Zeile zu löschen. Nach ein bisschen googlen habe ich herausgefunden, dass man dazu die Datei in eine neue Datei kopieren soll und die entsprechende Zeile auslassen soll. Daraufhin habe ich folgenden Code geschrieben:

(Die 1. 5 Zeilen stehen teilweise in Funktionen (mit try und catch) - habs jetzt hier so zusammengeschrieben. Ich gehe aber davon aus, dass die funktionieren.


```
File file = new File("original.txt");
File kopie = new File("kopie.txt");
Filewriter kwriter = new FileWriter(kopie, true);
FileReader freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);

int zeile = 10;
int counter = 0;
String line;
        
while(true)
{
     try{
          line = reader.readLine();

                    if(line != null)
                    {
                        if(zeile != counter)
                        {
                            kwriter.write(line);
                            kwriter.write(System.getProperty("line.separator"));
                        }
                        counter++;
                    }
                    else 
                        break;
                } catch(IOException e){
                    e.printStackTrace();
                }
            }
```

Könnt ihr mir sagen was ich falsch mache? Die Datei kopie.txt bleibt immer leer.


----------



## Timothy Truckle (11. Jan 2013)

IceHawk hat gesagt.:


> [JAVA=25]
> else
> break;[/code]


Damit verläßt Du die Schleife. Dh. Du machst nur einen einzigen Durchlauf. Und wenn die Text-Datei mit einer Leerzeile anfängt wird auch nichts geschrieben.
Was wolltest Du damit erreichen?

Darüber hinaus könnte ein 
	
	
	
	





```
kwriter.flush();
```
 helfen.

bye
TT


----------



## IceHawk (11. Jan 2013)

ich habe nun folgendes getestet, aber auch das gibt nichts aus.


```
//...
if(line != null)
                    {
                        kwriter.write("HALLO");
                        kwriter.flush();
                        if(zeile != counter)
                        {
                            kwriter.write("HALLO");
                            kwriter.write(System.getProperty("line.separator"));
                            kwriter.flush();
                        }
                        counter++;
                    }
//...
```



> Damit verläßt Du die Schleife. Dh. Du machst nur einen einzigen Durchlauf. Und wenn die Text-Datei mit einer Leerzeile anfängt wird auch nichts geschrieben.
> Was wolltest Du damit erreichen?



Es wird bei jedem Durchlauf eine Zeile eingelesen. Wenn es keine Zeile mehr gibt, hat line den Wert null. So wird doch jede Zeile eingelesen (und sollte auch geschrieben werden), oder?


----------



## Timothy Truckle (11. Jan 2013)

Gibt es eine Fehlermeldung auf der Konsole?

wird die Datei überhaupt angelegt?

bye
TT


----------



## IceHawk (11. Jan 2013)

Datei wird angelegt, aber es gibt keine Fehlermeldungen.


----------



## Timothy Truckle (11. Jan 2013)

IceHawk hat gesagt.:


> Datei wird angelegt, aber es gibt keine Fehlermeldungen.


Und die Original-Datei ist auch nicht leer?

bye
TT


----------



## IceHawk (11. Jan 2013)

nein, da ist genügend drin. mit einer anderen methode kann ich auch in die Datei schreiben (also die datei 'file' bzw. original.txt)


```
//....
writer.write(System.getProperty("line.separator"));
writer.write(test + " " + test2);                // test und test2 sind Strings
writer.flush();
//...
```

ist halt auch wieder code drum herum.


----------



## Timothy Truckle (12. Jan 2013)

OK, der [JAPI]FileWriter[/JAPI] möchte auch geschlossen werden, dann gehts.

bye
TT


----------



## IceHawk (12. Jan 2013)

und wie kann ich den dann wieder "öffnen", wenn ich die funktion erneut aufrufen möchte?

Wo muss das kwriter.close() denn hin? In den else Zweig?


----------



## tröööt (12. Jan 2013)

Timothy Truckle hat gesagt.:


> Damit verläßt Du die Schleife. Dh. Du machst nur einen einzigen Durchlauf. Und wenn die Text-Datei mit einer Leerzeile anfängt wird auch nichts geschrieben.
> Was wolltest Du damit erreichen?
> 
> Darüber hinaus könnte ein
> ...



hä ???


```
if(bool)
    call1();
else
    call2();
```

das BREAK wird NUR aufgerufen wenn "line==null" ... da das BREAK zum "else-block" gehört ...

nur mal so als info nebenbei

@TO
den loop sollte man nicht while(true) schreiben sondern eher while((line=readLine())!=null) ... dann erübrigt sich das if() im loop


----------



## Spin (12. Jan 2013)

Hallo,

deiner Herangehensweise eine Zeile in einer Datei zu löschen ist ok, aber: 
Wie sind die Zeilen in dem File voneinander getrennt?
Vielleicht ein Dash, ein Slash oder ein Leerzeichen, ein Punkt, ein Komma?

Einmal gegoogelt:
Remove line in File



> und wie kann ich den dann wieder "öffnen", wenn ich die funktion erneut aufrufen möchte?
> 
> Wo muss das kwriter.close() denn hin? In den else Zweig?



Am besten auch einmal in den Link luschern. Man macht das gewöhnlich am ende, sobald man fertig ist. Es ist möglich dieselbe Datei nochmal zu öffnen, aber diesen Usecase habe ich noch nie gesehen.


----------



## IceHawk (12. Jan 2013)

@Spin: Die Zeilen sind nur durch einen Zeilemumbruch getrennt.

Weiterhin habe ich die Funktion "removeLineFromFile(String file, String lineToRemove)" aus deinem Link ausprobiert, aber leider ohne Erfolg. (Der 1. Parameter ist doch dann "original.txt", oder?


----------



## hüteüberhüte (12. Jan 2013)

Bitteschön, kannst du gerne kopieren, wenn du willst (und noch ein paar englische Bezeichner/Namen reinknallen):


```
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @author hütte
 */
public class ZeilenLöschen {

    public static void lösche(String alt, String neu, boolean[] zuLöschen) throws FileNotFoundException, IOException {
        File f1 = new File(alt), f2 = new File(neu);
        if (!f2.exists()) {
            f2.createNewFile();
        }
        if (f1.equals(f2) || !f1.canRead() || !f2.canWrite()) {
            throw new IllegalArgumentException();
        }

        BufferedReader in = null;
        PrintWriter out = null;
        try {
            in = new BufferedReader(new FileReader(f1));
            out = new PrintWriter(new BufferedWriter(new FileWriter(f2)));
            String s = in.readLine();
            for (int i = 0; i < zuLöschen.length && s != null; i++, s = in.readLine()) {
                if (!zuLöschen[i]) {
                    out.println(s);
                }
            }
            out.flush();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws FileNotFoundException, IOException {
        String s1 = "alt.txt", s2 = "neu.txt";

        PrintWriter out = new PrintWriter(new BufferedOutputStream(new FileOutputStream(s1)));
        for (int i = 0; i < 10; i++) {
            out.printf("Hallo %d !%n", i);
        }
        out.close();

        boolean[] ba = new boolean[10];
        for (int i = 1; i < 10; i += 2) {
            ba[i] = true;
        }

        lösche(s1, s2, ba);
    }
}
```

try-(catch)-finally sollte auch genau so in dieser Form sein.

Es soll jede zweite Zeile beginnend bei 1 gelöscht/übersprungen werden, so dass nur noch Zeilen mit geraden Zahlen stehen.

Grüßle


----------



## DrZoidberg (12. Jan 2013)

Ich hab das mal ausprobiert und es funktioniert einwandfrei
Die 11. Zeile von original.txt fehlt in kopie.txt.


```
import java.io.*;

public class Loeschen {
    public static void main(String[] args) {
        try {
            File file = new File("original.txt");
            File kopie = new File("kopie.txt");
            FileWriter kwriter = new FileWriter(kopie, true);
            FileReader freader = new FileReader(file);
            BufferedReader reader = new BufferedReader(freader);
             
            int zeile = 10;
            int counter = 0;
            String line;
            while((line = reader.readLine()) != null) {
                if(zeile != counter) {
                    kwriter.write(line);
                    kwriter.write(System.getProperty("line.separator"));
                }
                counter++;
            }
            reader.close();
            kwriter.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}
```


----------

