|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
[JAVA] availability di un ObjectInpuStream
Mi succede una cosa veramente strana con un ObjectInputStream, ho un file contenente degli oggetti scritti con un writeObject() da un ObjectOutputStream e che cerco di rileggere con un ObjectInputStream, apro un FileInputStream sul File e lo inscatolo dentro l'ObjectInputStream, solo che l'availability di quest'ultimo è zero mentre quello del FileInputStream no!!!!
Questo è il codice Codice:
FileInputStream fis=new FileInputStream(this.theFile);
ObjectInputStream ois=new ObjectInputStream(fis);
System.out.println("Starting the cycle, availability (ois):"+String.valueOf(ois.available())+", availability (fis):"+String.valueOf(fis.available()));
while (ois.available()>0){
System.out.println("I'm in, trying to read");
ris.add((IEsame)ois.readObject());
System.out.println("I'm in, read");
}
ois.close();
fis.close();
return ris;
Codice:
Starting the cycle, availability (ois):0, availability (fis):5617 Qualcuno ha qualche idea???? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Non usare available(). E' un metodo che ha una documentazione sibillina. In particolare non si capisce se possa restituire zero, anche senza aver raggiunto la fine del file, quando non sia possibile leggere ulteriori byte senza bloccare il flusso di controllo. Probabilmente restituisce zero in entrambi i casi, cioè se ha raggiunto la fine del flusso oppure è possibile leggere zero byte prima di un blocco.
Usa FileChannel, position() e size() e vai sul sicuro. Codice:
FileChannel channel = new FileInputStream(file).getChannel();
ObjectInputStream ois = new ObjectInputStream(Channels.newInputStream(channel));
while(channel.position() < channel.size()) {
Object o = ois.readObject();
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! Ultima modifica di PGI-Bis : 08-05-2007 alle 15:54. Motivo: Un po' di grammatica, via! |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Può sembrare un po' "rozzo" ma funziona. (PGI-Bis, sei d'accordo con me?).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
Adesso ho una exception veramente esotica
Codice:
java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at esami2.dao.EsameDAO.findAll(EsameDAO.java:79) at esami2.dao.EsameDAOTest.testFindAll(EsameDAOTest.java:105) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:297) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:672) at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:567) Codice:
FileOutputStream fos=new FileOutputStream(this.theFile,true);
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(esame);
oos.close();
fos.close();
Ultima modifica di morskott : 08-05-2007 alle 16:23. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Io sono restio ad usare le eccezioni come condizioni di controllo, anche quando si tratta di EOFException che, se non ricordo male, sarebbe fatta apposta. Preferisco il canale che, con il suo bel cursore, è lì pronto a dirci quando non c'è più trippa per gatti.
morskott, devi mantenere una specularità tra il modo in cui scrivi ed il modo in cui leggi. Se la serializzazione di più oggetti avviene aprendo e chiudendo l'ObjectOutputStream per ogni scrittura allora la lettura di più oggetti deve essere fatta aprendo un nuovo ObjectInputStream per ogni oggetto. Se la serializzazione di più oggetti avviene "riciclando" uno stesso ObjectOutputStream (cioè lo apri una volta, ci scrivi 10 oggetti e poi lo chiudi) allora la deserializzazione va fatta riciclando uno stesso ObjectInputStream (lo apri una volta, leggi finchè puoi e poi lo chiudi). Il tuo codice rientra nel primo caso.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
risolto!!!!!!
grazie PGI!!! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:32.




















