Zdarvim,
vim ze chybu to nejspise neresi, ale ten problem me zajima, treba se
neco priucim....
2008/3/13 Jozef Babjak <[EMAIL PROTECTED]>:
> Dakujem obom za poznamky k riadeniu flow tej metody; obavam sa ale, ze moj
> problem neriesia. IMHO jedina "chyba" v tom flow je zbytocne 'else',
> kedze 'if' vetva
> konci prikazom 'break'.
>
>
> > me se nejak nelibi ten cyklus, vetsinou ho pisu takhle:
> > -----------------------------
> > while( ( bytesRead = in.read(buffer) ) > 0 ){
>
> ^-- Postfixny cyklus je pouzity preto, lebo v kazdej iteracii
> potrebujem naalokovat novy buffer.
Zajimalo by me proc potrebujete alokovat pokazde novy buffer. Doposud
jsem pri cteni z InputStreamu vzdy cetl do stejneho bufferu a nemel
jsem problem
>
>
> > ( vo tom vasem se mi nejak nelibi to while (bytesRead == CHUNK); )
>
> ^-- Logika toho cyklu je zalozena na tom, ze read(byte[]) moze v
> principe skoncit tromi sposobmi:
>
> 1) Vyhodi vynimku; k tomu v tomto pripade nedojde.
>
> 2) Dosiahol sa end-of-stream a vrati -1; osetrene break-om; cuduj sa
> svete, ani k tomuto nikdy nedojde.
>
> 3) Nacita up to CHUNK bajtov, umiestni ich do pola buffer a vrati
> hodnotu, kolko nacitala, pricom BLOKUJE
> pri nedostupnosti dalsich udajov, takze to, ze udaje prichadzaju po
> castiach, de facto nemusim riesit. V tomto
> pripade mam 2 moznosti, ako zareagovat:
>
> 3.A) Nacitalo sa prave CHUNK bajtov, t.j. cele pole; pole niekam
> ulozim (do BasicContent, ktory ulozim do
> AggregatedContent) a musim citat dalej (do noveho bufferu v dalsej
> iteracii), lebo sa patrne este neprecital cely stream.
>
> 3.B) Nacitalo sa menej ako CHUNK bajtov; patrne sa docitalo do konca
> streamu a teda dalej citat nemusim.
Obavam se ze zde je chyba - v javadocu jsem nenasel zminku ze musi
nacist presne tolik byte jako je delka bufferu, je tam zminka ze nacte
alespon 1 byte.
Je to sice na prvni pohled nelogicke (proc by to delal?), ale asi to
muze zpusobovat vas problem.
Take to asi bude duvod proc v pripade jednodussiho cyklu (while read >
0) jsem nikdy podobny problem nemel...
>
> Chyba je -- podla mojich pokusov -- v tomto bode 3.B. Zmena zaverecnej
> podmienky cyklu na
>
> while(bytesRead >= 0);
>
> alebo kludne na
>
> while(true);
>
> sposobi, ze slucka sa zopakuje aj po prvom "neuplnom" nacitani bufferu
> (t.j. readBytes < CHUNK) este raz
> a program zostane visiet vo volani in.read(); cakal by som, ze volanie
> read() vrati okamzite -1.
>
> No a tu vidim rozpor: Ak bol stream docitany do konca, read() ma
> vratit -1, nie sa blokovat. Ak ale nebol docitany
> do konca, preco sa read() neblokoval pri "predchadzajucom" volani a
> nedocital buffer doplna, az po CHUNK?
>
>
> > Pripadne obalit vstupni stream BufferedOutputStreamem......
>
> BufferedInputStreamom patrne. Vyskusam.
>
> J.
>
S pozdravem
Jindrich Vimr
--
Jindrich Vimr
<[EMAIL PROTECTED]>, <[EMAIL PROTECTED]>
http://www.jesta.net
Nyranska 46, 323 00 Plzen, Czech Republic
GSM: +420 604 711 457