# Dateiinhalt wird nicht in String eingelesen



## tklustig (24. Juni 2019)

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:



Hier der Code. Das Kuriose: Derselbe Aufruf der Methode etwas früher mit einer einzelnen Datei als Parameter funktioniert reibungslos:

```
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:

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


----------



## zerix (24. Juni 2019)

Hallo,

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

Viele Grüße
Sascha


----------



## tklustig (24. Juni 2019)

zerix hat gesagt.:


> Hallo,
> 
> Wo bleibt der Debugger denn stehen? Bleibt er direkt bei der ersten Datei stehen?
> 
> ...


Yupp. Wenn ich folgenden Methodencode verwende, funktioniert alles. Verbleibt die Frage, warum der Ursprungscode nicht funktioniert:

```
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 (24. Juni 2019)

Hi tklustig,

du kannst alternativ auch folgenden Einzeiler verwenden, das Auslesen von Dateien ist im JDK drin:

```
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


----------



## tklustig (24. Juni 2019)

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 
	
	
	



```
System.exit(-1);
```
 verwende, brauch' ich ihn auch nicht zu schließen, oder?


----------



## Bratkartoffel (24. Juni 2019)

tklustig hat gesagt.:


> nicht höher als JDK1.5




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?)



tklustig hat gesagt.:


> 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.



tklustig hat gesagt.:


> Wenn ich ein
> 
> 
> 
> ...


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


----------



## tklustig (24. Juni 2019)

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:

```
this.logger.error(e);
e.printStackTrace();
System.exit(-1);
```


----------

