Dateiinhalt wird nicht in String eingelesen


tklustig

Erfahrenes Mitglied
#1
Hallo Leute,
folgender Code soll eigentlich den Inhalt einer 447 KB großen Datei in einen String einlesen. Tut er aber nicht. Ich bekomme weder einen Fehler noch sonstwas verwertbares. Der Debugger in Netbeans bleibt einfach stehen:

netbeansDebug.jpg
Hier der Code. Das Kuriose: Derselbe Aufruf der Methode etwas früher mit einer einzelnen Datei als Parameter funktioniert reibungslos:
Java:
            File folderOfNewFiles = new File("U:" + File.separator + "OWS_FILES" + File.separator);
            File[] arrayOfNewFiles = folderOfNewFiles.listFiles();
            for (int i = 0; i < arrayOfNewFiles.length; i++) {
                /*ToDo: jedes einzelne Element decodieren*/
                try {
                    filename = arrayOfNewFiles[i].toString();
                    oldContentOfFile = this.readFile(filename);
                    newContentOfFile = this.decodeText(oldContentOfFile, codeFormat);
                } catch (IOException e) {
                    this.logger.error(e);
                    e.printStackTrace();
                }
                try {
                    arrayOfNewFiles[i].delete();
                    arrayOfNewFiles[i].createNewFile();
                    PrintWriter writer = new PrintWriter(arrayOfNewFiles[i]);
                    writer.println(newContentOfFile);
                    writer.flush();
                    writer.close();  
                } catch (IOException e) {
                    this.logger.error("Fehler während der Erstellung der Datei:" + filename + newline + e);
                }
            }
Hier die Methode:
Java:
    private String readFile(String path) throws IOException {
        String readString = "", giveBackString = "";
        try {
            BufferedReader in = new BufferedReader(new FileReader(path));
            try {
                while ((readString = in.readLine()) != null) {
                    giveBackString += readString;
                }
                in.close();
            } catch (IOException e) {
                System.out.println("Read error: " + e);
            }
        } catch (IOException e) {
            System.out.println("Open error: " + e);
        }
        return giveBackString;
    }
 
Zuletzt bearbeitet:

tklustig

Erfahrenes Mitglied
#3
Hallo,

Wo bleibt der Debugger denn stehen? Bleibt er direkt bei der ersten Datei stehen?

Viele Grüße
Sascha
Yupp. Wenn ich folgenden Methodencode verwende, funktioniert alles. Verbleibt die Frage, warum der Ursprungscode nicht funktioniert:
Java:
    private String readFiles(String path) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(path));
        StringBuffer sb = new StringBuffer();
        String line,strFile;
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        strFile = sb.toString();
        br.close();
        return strFile;
    }
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#4
Hi tklustig,

du kannst alternativ auch folgenden Einzeiler verwenden, das Auslesen von Dateien ist im JDK drin:
Java:
private String readFiles(String path) throws IOException {
    return new String(Files.readAllBytes(Paths.get("path")), StandardCharsets.UTF_8);
}
Der Unterschied bei deinen beiden Implementierungen ist, dass du in einem Fall durch das "+=" auf einem String bei jeder Iteration einen neuen String erstellst, was sehr Speicherintensiv ist und wahrscheinlich einfach zu lange dauert (somit scheint der Debugger zu hängen).

Bei deiner "funktionierenden" Lösung aber noch ein paar Anmerkungen:
  • Nimm nicht den StringBuffer, sondern den StringBuilder. Der performt besser, da er nicht synchronized ist
  • Du schliesst deinen "br" nicht, wenn eine Exception auftritt
  • Du verlierst durch deine Lösung die Zeilenumbrüche, ist das so beabsichtigt?
Aber auch dein Code oben hat einen Bug:
Wenn das readFile() eine Exception wirft, so ist dein "newContentOfFile" = null. Somit versuchst du mit dem darauf folgenden Block "null" in die Datei zu schreiben, was im Endeffekt bedeutet dass du die Datei leerst. (Müsste man ausprobieren, was bei einem write(null) passiert, es könnte auch eine IOE fliegen)

Grüsse,
BK
 
Zuletzt bearbeitet:

tklustig

Erfahrenes Mitglied
#5
Deine Lösung klappt bei mir nicht, da ich nicht höher als JDK1.5 gehen kann! Deine sonstigen Anmerkungen werde ich berücksichtigen. Die Zeilenumbrüche können verloren gehen, das macht nix!Wie schliesse ich den br wieder. Der catch Block kennt ihn gar nicht. Wenn ich ein
Java:
System.exit(-1);
verwende, brauch' ich ihn auch nicht zu schließen, oder?
 
Zuletzt bearbeitet:

Bratkartoffel

gebratene Kartoffel
Premium-User
#6
:eek:

Du weisst schon, dass Java 5 Ende 2004 released wurde und seit 2009! keine Sicherheitsupdates mehr bekommt? (Läuft das überhaupt noch auf einem aktuellen Linux / Windows?)

Der catch Block kennt ihn gar nicht.
Ja, du müsstest den "br" ausserhalb des try-Blocks definieren und im catch dann ein "if(br != null) br.close();" machen.

Wenn ich ein
Java:
System.exit(-1);
verwende, brauch' ich ihn auch nicht zu scließen, oder?
Ja, wobei das halt wirklich Kannonen auf Spatzen ist und eher Probleme machen kann. (Du kannst deinen Code somit z.B. nicht mehr testen)

Grüsse,
BK
 
Zuletzt bearbeitet:

tklustig

Erfahrenes Mitglied
#7
Yuup! Läuft noch. Das Programm ist bereits mehrere Jahre alt. Da der Webserver, der die XML File entgegen nimmt, seit neuestem Dateien > 1MB nicht mehr akzeptiert, muss ich die XML File splitten und alle einzeln verschicken, anstatt einer großen...
Wenn die Exception ausgeworfen wird, macht der weitere Ablauf sowieso keinen Sinn mehr. Dann kann ich die Anwendung beenden. Vorher habe ich die Exception allerdings noch geloggt:
Java:
this.logger.error(e);
e.printStackTrace();
System.exit(-1);
 
Zuletzt bearbeitet:

Neue Beiträge