Prüfen ob Datei noch geöffnet ist

Java:
private void dateiSplit() throws FileNotFoundException, IOException {

        String line = "";
        String zul = "";
        int test = 0;

        String rootPath = rootPathWin;

        try {
            BufferedReader b = new BufferedReader(new InputStreamReader(new FileInputStream(rootPath + "\\fern.dat")));
            BufferedWriter br = null;
            while ((line = b.readLine()) != null) {
             
                if (line.startsWith("\021\033S")) {
                    test++;
                    File file = new File(rootPath + "\\" + test + ".fuell");
                    if (file.exists()) {
                        file.delete();
                    }
                    br = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(rootPath + "\\" + test + ".fuell")));
                    br.write(line + "\n");
                    while ((line = b.readLine()) != null) {
                        if ((!line.startsWith("ENDE    NL")) & (!line.startsWith("FIN NC NL")) & (!line.startsWith("\004\033"))) {
                            br.write(line + "\n");
                            br.flush();
                        } else {
                            br.write(line + "\n");
                            br.flush();
                            break;
                        }
                    }
                    br.flush();
                }

            }
            br.close();
            b.close();
        } catch (Exception ex) {
            System.out.println(ex);
        }

    }
 
Also was mir da direkt auffällt ist:
a) Du verwendest kein try with resources (was nicht per se falsch ist), aber das Schließen wird nicht gemacht, wenn eine Exception auftritt.
b) Du schließt nur den letzten BufferedWriter. Damit werden die geschriebenen Dateien etwas länger geöffnet bleiben.

Generell bietet es sich hier bei bei b und br an, try-with-resources zu nutzen.
 
ahh verstanden danke . meinst du das liegt daran das die datei.dat noch geöffnet ist obwohl ja der bufferedreader (b) unten geschlossen wird
 
Die Datei des Readers wird geschlossen und sollte nicht mehr offen sein (So keine Exception geworfen wurde - hast Du eine entsprechende Exception?)
Die Dateien des Writes (*.fuell) werden bis auf die letzte nicht geschlossen.
 
Java:
 while ((line = b.readLine()) != null) {
                        if ((!line.startsWith("ENDE    NL")) & (!line.startsWith("FIN NC NL")) & (!line.startsWith("\004\033"))) {
                            br.write(line + "\n");
                            br.flush();
                            br.close();
                        } else {
                            br.write(line + "\n");
                            br.flush();
                            break;
                        }
                    }
                    br.flush();
jetzt aber :)
 
Wieso schaust Du Dir nicht das try with resources an? Wenn eine Exception auftritt, wird kein close() mehr aufgerufen....
Dazu kommt noch, dass die Exception Behandlung nur ein einfaches println ist! Also gute Chancen, dass Du dies auch noch übersichst.

Java:
private void dateiSplit() throws FileNotFoundException, IOException {

        String line = "";
        String zul = "";
        int test = 0;

        String rootPath = rootPathWin;

        // Der hier war trivial, da ehh schon ein try vorhanden war!
        try (BufferedReader b = new BufferedReader(new InputStreamReader(new FileInputStream(rootPath + "\\fern.dat")))) {
            // Das schieben wir dann auch mal dahin, wo es hin gehört ..
            // BufferedWriter br = null;
            while ((line = b.readLine()) != null) {
            
                if (line.startsWith("\021\033S")) {
                    test++;
                    File file = new File(rootPath + "\\" + test + ".fuell");
                    if (file.exists()) {
                        file.delete();
                    }
                    // Hier kommt dann noch ein try dazu ...
                    try (BufferedWriter br = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(rootPath + "\\" + test + ".fuell")))) {
                      br.write(line + "\n");
                      while ((line = b.readLine()) != null) {
                         br.write(line + "\n"); // Das kommt ja immer, also gerne außerhalb der if Abfrage.
                         if ((!line.startsWith("ENDE    NL")) & (!line.startsWith("FIN NC NL")) & (!line.startsWith("\004\033"))) {
//                            br.write(line + "\n");
//                            br.flush();
                          } else {
//                            br.write(line + "\n");
//                            br.flush();
                            break;
                          }
                      }
                    }
                    br.flush();
                }

            }
            // Die fliegen raus!
//            br.close();
//            b.close();
        } catch (Exception ex) {
            System.out.println(ex);
        }

    }
Und die flush() Aufrufe müssten eigentlich auch gehen können. Beim Schließen kommt beim BufferedWriter meines Wissens auch vorab ein flush().

Und dann noch das if invertieren so dass man da nur noch ein if (...) break; hat und der Code ist deutlich kleiner und übersichtlicher geworden ...
 
Java:
 while ((line = b.readLine()) != null) {
                        if ((!line.startsWith("ENDE    NL")) & (!line.startsWith("FIN NC NL")) & (!line.startsWith("\004\033"))) {
                            br.write(line + "\n");
                            br.flush();
                            br.close();
                        } else {
                            br.write(line + "\n");
                            br.flush();
                            break;
                        }
                    }
                    br.flush();
jetzt aber :)
Ne, jetzt passiert Unsinn, der auf den ersten Blick zu ner Exception führen dürfte.

Nimm try-with-resources, an einer sauberen Umsetzung scheiterst du ebenso wie die meisten anderen.
 
Ok verstehe ist das so kompliziert das ohne try-with-resources hinzukommen
Nein, man muss nur verstehen, wie es geht.

Zugriff ohne try-with-resources ist immer nach einem einfachen Pattern:
Java:
SomeCloseableType variable;
try {
    variable = someInitialization();
    // Use variable here
} finally {
    try {
        if (variable != null) variable.close();
    } catch (Exception ex) {}
}
Und das ist dann halt ebenbürtig zu:
Java:
try (SomeCloseableType variable = someInitialization()) {
  // Use variable in here
}
Welche der beiden Varianten Du nutzen willst, ist Dir überlassen. Aber ohne eine entsprechende Lösung ist es in meinen Augen schlicht falsch!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben