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

Odpovedet emailem