StreamCorruptedException: invalid stream header: 0D0A0D0A

0

Witam

Tytułowy wyjątek leci mi w sytuacji, gdy akcja (klasa rozszerza org.apache.struts.action.Action) w odpowiedzi zwraca obiekt, a potem plik, jak niżej:

File lvPakietWewnetrzny = new File("jakassciezka.zip");
FileInputStream lvFIS = null;
OutputStream lvOUT = null;
try {
	lvOUT = response.getOutputStream();
	new ObjectOutputStream(lvOUT).writeObject(
			new OpisPakietu(lvPakietWewnetrzny.getName(), null));
	lvFIS = new FileInputStream(lvPakietWewnetrzny);
	IOUtils.copy(lvFIS, lvOUT);
} finally {
	if(lvFIS!=null) try{lvFIS.close();}catch(Exception e){}
	if(lvOUT!=null) try{lvOUT.close();}catch(Exception e){}
}

a przechwytywanie tego dalej wygląda tak:

InputStream lvIS = null;
try {
    lvIS = urlConnection.getInputStream();
    OpisPakietu opis = (OpisPakietu) new ObjectInputStream(lvIS).readObject(); //tu mi wyrzuca wyjątek
   //i dalej idzie odczyt pliku...

Klasa OpisPakietu implementuje Serializable, ma tylko dwa pola typu String, IOUtils to klasa z pakietu org.apache.commons.io. Błąd ten leci bardzo rzadko, nawet nie potrafię powtórzyć sytuacji. Gdzieś wyczytałem, że to może być kwestia kodowania pliku, tylko, że najpierw jest czytany obiekt, więc to chyba nie to, w innym miejscu dowiedziałem się, że nagłówek http kończy się właśnie taką sekwencją znaków (0d 0a 0d 0a), tylko dlaczego miałby czytać ostatnie bajty nagłówka? Może ktoś wie, jak rozwiązać ten problem?

0

Czy aby kod odczytujący strumień nie próbuje go odczytać gdy wciąż jest on jeszcze zapisywany? Czy jest taka teoretyczna możliwość?
Przypisz referencje strumieni do zmiennych i sprawdź na każdym etapie czy wszystko jest oraz musi być w porządku. Poszczególne etapy na czas testów odseparuj czasowo (może być sleep). Dane strumienia zapisz jako ciąg bajtów i porównaj na wyjściu ze strumienia czy zawsze otrzymujesz to samo. A jeżeli nie to samo to gdzie jest więcej, a gdzie mniej danych i w jakim miejscu.
Jeżeli faktycznie jest tak iż do strumienia leci końcówka nagłówka http, to może oznaczać, że z jakiegoś powodu wysypał się parser nagłówka http lub coś w trakcie resetuje strumień i leci do niego cały nagłówek.
Musisz też uwzględniać błędy sieci - komputer jest urządzeniem przewidywalnym ale nie od momentu gdy podłączysz do niego radio. ;)
Raczej zakładaj, że transmisja czasem się powiedzie niż czasem się nie powiedzie.

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