Zdravim,
odpovedi nize....
2008/3/13 Jozef Babjak <[EMAIL PROTECTED]>:
> > > > 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
>
> ^-- To je velmi jednoduche: lebo tie udaje potrebujem. :-)
>
> Presnejsie: citam zo siete stream, konkretne odpoved HTTP servera,
> ak by na tom zalezalo. Tato odpoved moze mat niekolko desiatok bajtov,
> ale kludne moze mat 10MB. Takze nemozem dopredu vediet, aky velky
> buffer bude dostatocny na nacitanie udajov. Preto citam udaje po castiach
> s velkostou CHUNK a tieto casti si odkladam (kazdu ulozim do BasicContent,
> a tieto objekty skladam do AggregatedContent); citanie ukoncim, ak sa
> nacita prvy "neplny" buffer.
>
> Problem je, ze prvy "neplny" buffer sa nacita skor, ako by sa doslo na koniec
> streamu, a tato situacia je tym pravdepodobnejsia, cim je spojenie so
> serverom
> pomalsie alebo generovanie tohto obsahu trva dlhsie. Nedojde vsak k
> predcasnemu
> uzatvoreniu ci vypadku spojenia, co by -- dufam -- bolo signalizovane
> vynimkou.
>
To chapu, ale ten buffer muzete samozrejme "recyklovat", InputStream
vam do nej nakopiruje data ze vstupu a je mu jedno ze tam predtim
nejaka data byla.
Jediny problem by byl pokud by konstruktor new BasicContent(buffer,
bytesRead) predany buffer sebere pro sebe, coz nepredpokladam (bylo by
to velmi nestandardni reseni).
>
> > > 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.
>
> ^-- Ako konkretne to ma sposobovat moj problem? Stale nerozumiem.
>
No, obavam se ze InputStream vam nakopirovava do daneho bufferu
vetsinou tolik byte jako je delka bufferu, ale obcas se rozhodne tam
nakopirovat min, i kdyz ma dalsi data k dispozici.
Bohuzel toho se chytne vase podminka
--------------------------------------------
while (bytesRead == CHUNK);
------------------------------------------
a usoudi ze uz dorazila vsechna data, i kdyz tomu tak neni.
(t.j. chyba je patrne ve vasem predpokladu
---------------------------------------------------
3.B) Nacitalo sa menej ako CHUNK bajtov; patrne sa docitalo do konca
streamu a teda dalej citat nemusim )
------------------------------------------------------
Doporucoval bych drzet se toho co rika javadoc (read vraci pocet
nactenych byte, nebo -1 kdyz je konec), a neusuzovat na zadne dalsi
chovani
a kontrolovat ze bylo nacteno nezaporne mnozstvi byte
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