Attempted read from closed stream - nie widze gdzie jest zamykany

0

Witam, mam 2 problemy. Kod ponizej (pomijam wyjatki/bloki/itd)

HttpResponse response = null;
try {
	response = client.execute(post);
	} catch (costam) {;}
	HttpEntity entity = response.getEntity();
	String inputLine = "";
	BufferedReader in = null;
	try {
		in = new BufferedReader(new InputStreamReader(entity.getContent()));
		while ((inputLine = in.readLine()) != null) {
			System.out.println(inputLine); // **na wyjsciu widze, ze inputLine = "test"**
			catch (itd) {;}
			
			FileOutputStream fos = null;
			try {
				fos = new FileOutpuStream(mojPlik);
				entity.writeTo(fos); // **tutaj komunikat: attempted read from closed stream exception**
				catch (costam) {;}
				finally {in.close(); fos.close();}
				
				assertEquals("test", inputLine); // **tutaj komunikat: expected <test> but was: <null>**

Typy HttpEntity, HttpPost, itd - apache 4+. Jesli w petli while zmienna inputLine jest rowna "test", a poza petla nawet nie pustemu stringowi, tylko null, tzn, ze objekt na ktory wskazywala przestal istniec? Z kolei blad "attempted to read from closed stream" - nie wiem nawet czemu mogloby sie tak dziac... jedyna methoda wywolana na "entity" to getContent() - w dokumentacji napisali, ze "konsumuje" moj obiekt entity, ale nie chyba nie wywoluje close()?

0

Ale o co ty w ogóle pytasz?

Jesli w petli while zmienna inputLine jest rowna "test", a poza petla nawet nie pustemu stringowi, tylko null, tzn, ze objekt na ktory wskazywala przestal istniec

Nie. To znaczy ze przypisano jej wartość null. Co zresztą się dzieje! MYŚL! Popatrz na swoją pętlę:

 while ((inputLine = in.readLine()) != null) {

To znaczy: przypisz do inputLine wartość wczytaną z pliku i powtarzaj pętlę dopóki to nie będzie null. Czyli pętla przerwie sie dopiero jak inputLine == null. Siłą rzeczy w takim razie za pętlą inputLine ma wartość null.

Konsumuje obiekt / strumień = wyciąga dane i zamyka.

0

Aha, no tak :)
Czyli getContent() zamyka, tak? Musialem przegapic w dokumentacji, dzieki.

0

Nie, nie zamyka. Ale to może być strumień który możesz iterować tylko raz. Wyobraź sobie że np. czytasz z pliku. Obiekt za pomocą którego czytasz pamięta pozycję na której skończyłeś czytać ostatnio. Jak dojdziesz do końca pliku to już nic nie wczytasz, bo jesteś na końcu ;]

0

Hmm, ok. Gdybym wiec chcial czytac pare razy, moglbym "entity" upchnac np w BufferedHttpEntity? Potem czytac wiele razy? Doczytalem sie tego w apche http tutorial.

1 użytkowników online, w tym zalogowanych: 0, gości: 1