BufferedWriter voll?

Status
Nicht offen für weitere Antworten.

K-Man

Bekanntes Mitglied
Hallo
Ich habe eine Methode, die einen Stream Zeilenweise mit Daten füttert. Es handelt sich bei meinem Beispiel um eine Sequenz von knapp 600.000 Zeichen.

Hier der Code:
Code:
	public void printSeqInFastaFormat(OutputStream os) throws IOException
	{
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
		bw.write(">" + getName());
		bw.newLine();
		
		if(getSequence().length() > 60)
		{
			int n = getSequence().length() / 60;
			
			for(int i = 0; i <= n; i++)
			{
				if(i == n)
				{
					bw.write(getSequence().substring(i*60));
					break;
				}
				bw.write(getSequence().substring(i*60, (60*i)+60));
				bw.newLine();
			}
			bw.flush();
		}		
	}

Meine Frage:
Warum brauch ich am Ende der Schleife ein flush? Ohne dem flush gibt er mir ungefähr 450.000 Zeichen aus und hört immer an der selben Stelle auf. Nur mit dem flush wird der komplette String ausgegeben. Kann es sein, dass der Puffer irgendwann voll ist und der Stream nichts mehr aufnimmt? Aber da ich ja die Zeichen Zeilenweise schreibe, dachte ich mir, dass es eh kein Problem geben dürfte...

Edit:
getSequence ist eine Methode, die mir die 600.000-Zeichen-Sequenz leifert..
 
du kannst auch close() schreiben, das ist eh Pflicht

flush deswegen, weil das ding ja BUFFEREDWriter heisst, d.h. nicht jedes Byte sofort losgeschickt (Festplatte, Netzwerk) wird sondern erst mal gesammelt

wenn er gerade keine Lust hat, wird er erstmal einen Haufen im RAM ansammeln und dann ganze Brocken auf einmal wirklich rausschreiben
 
close hab ich schon, da ich aber den Stream übergebe, will ich den Stream nicht über die Methode schließen. Das macht die Klasse, die den Stream erzeugt. Ich weiß nicht, wie ich den Sream einfach wieder öffnen kann. Es gibt ja keine open-Methode. Da hab ich unter Netzwerkprogrammierung eh ne Frage gestellt.

Das mit dem Buffered hab ich schon verstanden. Ich versteh nur nicht, warum er den Rest nicht mehr ausgibt. Er schreibt wie gesagt ein paar Zeilen (die ersten ca. 450.000 Zeichen) und hört dann komplett auf...
 
er hört einfach auf?

was macht denn eigentlich das break? mach davor ein flush, wenns denn unbedingt so sein soll?
 
Bleiglanz hat gesagt.:
er hört einfach auf?

was macht denn eigentlich das break? mach davor ein flush, wenns denn unbedingt so sein soll?
Das ist ja genau meine Frage. Ich brauch eben dieses flush, damit alles ausgegeben wird. Ich versteh nur nicht, warum er ohne dem flush nicht alles ausgibt.
Das break sagt einfach, dass er aufhören soll, nachdem die letzte Zeile ausgegeben wurde. Danach kommt eh schon der flush...
 
Dann Versuchs ich mal zu erklären 😉.

Der BufferedWriter "sammelt" so viele Daten an, bis er voll ist => Dann schreib er sie, damit nicht jedes Byte einzeln geschrieben werden muss.

Wenn jetzt nicht genug Daten geschrieben werden sollen, sodass der Buffer voll wird, wartet der BufferedWriter bis noch weitere Daten dazukommen (bis er eben voll ist). Möchtest du jetzt die Daten schreiben, ohne dass der Buffer zwingend voll sein muss, so setzt du ein flush bzw. close.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben