On Mon, 17 Oct 2005, Ondřej Fafejta KYBERIE wrote:

Zdravím konferenci!

Narazil jsem na zajímavý problém při parseování emailů pomocí API JavaMail.
Viz. kód

Part p;  // ... viz. API JavaMail
// ...
Object o = p.getContent();

if (o instanceof InputStream){
 InputStream is = (InputStream)o;
 byte data[]=new byte[is.available()];
 int res=is.read(data);

 System.out.println("Nacteno "+res+"  xxx velikost pole "+data.length);
}

Výsledek je dosti překvapivý:
Nacteno 64509  xxx velikost pole 65357

Pokud jsem to zkoušel s FileInputStream nebo s ByteArrayInputStream, tak
to fungovalo správně.
Problém se vyskytuje při použití API JavaMail v případě, že se snažím
vrátit data přílohy.

Co dělám špatně?

Spatne pouzivate metodu available(). Ta vraci pocet bytu, ktere lze precist aniz by se volajici zablokoval. V tomto pripade je to zrejme velikost interniho bufferu onoho proudu. S poctem bytu, ktere se daji z proudu precist tato hodnota nema nic spolecneho. Data je treba cist tak dlouho nez metoda read() vrati -1.

S pozdravem,

Stepan Roh

Odpovedet emailem