tonio123
04-11-2012, 22:39
Salve a tutti, sto cercando di scrivere una serie di funzioni per rendere più rapido l'utilizzo delle datagramsocket in java, ma ho dei problemi con l'objectOutputStream, per spiegarmi meglio ho scritto questo programmino:
public static void main(String[] args) throws IOException, ClassNotFoundException{
Address pippo=new Address("230.0.0.1",54321);
ByteArrayOutputStream buf=new ByteArrayOutputStream();
ObjectOutputStream out=new ObjectOutputStream(buf);
for(int i=0; i<30; i++){
out.writeObject(pippo);
out.flush();
ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
System.out.println(in.readObject());
in.close();
buf.reset();
}
Se fatto girare spara un StreamCorruptedException dopo la prima iterazione, per il momento googlando sono arrivato a capire che il problema è che quando l'objectInputStream va a leggere dall'array non trova un header e per questo manda l'eccezione, ma non capisco perchè questo accada, probabilmente c'entra qualcosa la reset di buf che cancella cose che non dovrebbe.
se alla fine faccio
buf.reset();
out.close();
out=new ObjectOuputStream(buf);
//out.reset();
funziona, ma in mainera troppo lenta, passeranno un 3-4 secondi tra una scrittura e la successiva. Mentre con la out.reset() che in teoria secondo la documentazione dovrebbe fare la stessa cosa, la velocità c'è ma non risolvo il problema.
Qualche idea su cosa stia sbagliando?
EDIT: dopo ulteriori ricerche pare che la reset() cancelli una cache di oggetti in objectoutputstream che usa a fini di ottimizzazione, ma non resetta il canale.
C'è un modo per forzare objectOutputStream a reinizializzare il canale scrivendo gli opportuni header? Eccetto creare un nuovo oggetto che mi rallenta mostruosamente tutto?
Oppure perchè la creazione di un nuovo objectOutputStream mi rallenta così tanto?
public static void main(String[] args) throws IOException, ClassNotFoundException{
Address pippo=new Address("230.0.0.1",54321);
ByteArrayOutputStream buf=new ByteArrayOutputStream();
ObjectOutputStream out=new ObjectOutputStream(buf);
for(int i=0; i<30; i++){
out.writeObject(pippo);
out.flush();
ObjectInputStream in=new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
System.out.println(in.readObject());
in.close();
buf.reset();
}
Se fatto girare spara un StreamCorruptedException dopo la prima iterazione, per il momento googlando sono arrivato a capire che il problema è che quando l'objectInputStream va a leggere dall'array non trova un header e per questo manda l'eccezione, ma non capisco perchè questo accada, probabilmente c'entra qualcosa la reset di buf che cancella cose che non dovrebbe.
se alla fine faccio
buf.reset();
out.close();
out=new ObjectOuputStream(buf);
//out.reset();
funziona, ma in mainera troppo lenta, passeranno un 3-4 secondi tra una scrittura e la successiva. Mentre con la out.reset() che in teoria secondo la documentazione dovrebbe fare la stessa cosa, la velocità c'è ma non risolvo il problema.
Qualche idea su cosa stia sbagliando?
EDIT: dopo ulteriori ricerche pare che la reset() cancelli una cache di oggetti in objectoutputstream che usa a fini di ottimizzazione, ma non resetta il canale.
C'è un modo per forzare objectOutputStream a reinizializzare il canale scrivendo gli opportuni header? Eccetto creare un nuovo oggetto che mi rallenta mostruosamente tutto?
Oppure perchè la creazione di un nuovo objectOutputStream mi rallenta così tanto?