Amortizovaně to máš v konstatním čase na přečtený byte. Máš
pocit, že tam je bottleneck, abys to musel optimalizovat "na
konstantu"?
S pozdravem
Ondra Nekola
[EMAIL PROTECTED]
http://www.nekola.cz/
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