Patrik Beno wrote:
>ahoj.
>
>metoda InputStream.read(buf, from to) a inkrementalne plnenie buffera
>velmi strucne a bez nejakej kontroly (snad to bude fungovat):
>
> InputStream in;
> byte[] data = new byte[size];
> int read = 0;
> int pos = 0;
> while (read != -1) {
> read = in.read(data, pos, in.available());
> pos += read;
> }
>
>
Zdravím!
Díky za odpověd.
V tomto případě mě chybí stejně to nejpodstatnější - jak mám určit
velikost pole data (size), aby se mi tam celý obsah streamu vešel?
to bych musel udělat něco takového (píšu to z hlavy, tak že to není
vyzkoušené)
InputStream in;
byte[] data = new byte[1024]; // vychozi velikost pole
int read = 0;
int pos = 0;
while(read !=-1){
read=in.read(data, pos, data.length-pos);
if(read==data.length-pos){
byte[] newData= new byte[2*data.length]; // vytvorime pole dvakrat
delsi nez puvodni velikost
System.arraycopy(data,0,newData,0,data.length); // zkopirujem data do
noveho vetsiho pole
data=newData;
}
if(read!=-1) pos+=read;
}
Na závěr stejně potřebuju pole o velikosti přílohy, tak že bych ještě jednou
musel použít arraycopy.
byte[] finalData=new byte[pos];
System.arraycopy(data,0,finalData,0,pos);
Tento způsob mě také napadl, ale připadal mi strašně složitý, pomalý a
těžkopádný.
Na java.nio se ještě podívám.
Zatím jsem to vyřešil tak, že ten buffer, do kterého načítám přílohy, je
dostatečně veliký.
Vím to z toho důvodu, že nastavím velikost bufferu na velikost celého emailu.
Tedy příloha je vždy menší než celý email.
Kopírování pomocí System.arraycopy provedu pouze jednou u každé přílohy.
Díky
Fafi