Einlesen von Dateien- wer kann mir den Code erklären ?

Status
Nicht offen für weitere Antworten.

ich_wills_wissen

Bekanntes Mitglied
Hi zusammen,

habe gerade in einem Buch folgenden Code zum Einlesen von Datei-inhalten gefunden, den ich leider nicht
so ganz verstehe:

Code:
File urlListeDatei = new File("meineDatei.txt");
FileReader fr = new FileReader(urlListeDatei);
			
StringBuffer buffer = new StringBuffer();
			
int bytesRead = 0;
char[] textRead = new char[512];
while((bytesRead = fr.read(textRead)) > 0)
    { 
	buffer.append(textRead, 0, bytesRead);
    }
fr.close();

Was ich nicht verstehe ist die Bedingung der while-Schleife.
Über die benutzte read-Methode steht in der API-Doku:

public int read(char[] cbuf) throws IOException

Read characters into an array. This method will block until some input is available, an I/O error occurs, or the end of the stream is reached.

Parameters:
cbuf - Destination buffer
Returns:
The number of characters read, or -1 if the end of the stream has been reached
Throws:
IOException - If an I/O error occurs

Das Ende des Streams ist nach meinem Verständnis erreicht, wenn alle Daten aus der Datei gelesen wurden.
Das char-Array (textRead) ist aber hier nur 512-byte lang, d.h. bei größeren Dateien läuft das Array über oder wie ? ???:L
Und wenn dann das Ende des Streams erreicht ist, wird alles in den StringBuffer geschrieben.

Wäre nett wenn das jemand für mich in verstänbdliche Worte fassen könnte (also die Zeile "while((bytesRead = fr.read(textRead)) > 0)"). Danke !


Gruß,

ich_wills_wissen
:###
 
fr.read ließt nur soviel ein, wie in das übergebende Array auch reinpasst,
und gibt dann die Anzahl der gelesenen Zeichen zurück,
solange die > 0 ist, schreibt man die gelesenen Zeichen irgendwohin und macht weiter, da ja vielleicht noch mehr zu holen ist,

wenn 0 oder wahrscheinlich -1 erreicht ist, dann ist man fertig, die Schleife wird beendet,

theoretisch könnte man wohl auch bei
while((bytesRead = fr.read(textRead)) < textRead.length)
aufhören,

wenn irgendwann mal nur 400 Zeichen gelesen werden, obwohl 512 reinpassen, dann dürfte danach nichts mehr kommen,
eine weitere Schleife schadet aber auch nicht

Beispiel:
2000 Daten
->
512,
512,
512,
464,
-1 -> Ende
 
SlaterB hat gesagt.:
wenn 0 oder wahrscheinlich -1 erreicht ist, dann ist man fertig, die Schleife wird beendet,

Denke es müsste eher 0 sein, üblich ist doch immer die Anzahl der tatsächlich gelesenen Bytes zurück zu geben...
 
> Returns:
> The number of characters read, or -1 if the end of the stream has been reached

aber streiten lohnt nicht, wenn keiner Lust hat, zu testen 😉

-------

wichtig ist übrigens, dass das Array normalerweise die hinteren Positionen beibehält, wenn es im letzten Schritt nur noch halb gefüllt wird,
deshalb auch nur die Hälfte davon ausgeben
buffer.append(textRead, 0, bytesRead);
sonst kommt es zu merkwürdigen Wiederholungen
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben