Grazie andbin.
Ieri, lavorandoci un pò su, ho tirato fuori questo.
codice:
public List<X> readElement(Class<? extends X> cl, String fileName){
List<X> list = new ArrayList<>();
try (
final InputStream file = new FileInputStream (fileName);
final InputStream bstream = new BufferedInputStream (file);
final ObjectInputStream ostream = new ObjectInputStream (bstream);
)
{
while (true) {
Object obj = ostream.readObject();
list.add(cl.cast(obj));
}
} catch (EOFException e) {
System.out.println("Ok: file finito, esce");
} catch (FileNotFoundException e) {
System.out.println("Ok: file non trovato, lo crea");
File f = new File(fileName);
try {
f.createNewFile();
} catch (IOException e1) {
/*Non entra mai qui*/
e1.printStackTrace();
}
} catch (IOException e) {
System.out.println("Errore: file corrotto");
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (ClassCastException e) {
System.out.print("Errore: cast errato");
}
return list;
}
Ho deciso, come hai giustamente fatto notare, che era poco intuitivo passare il file, o comunque il path, al costruttore.
Così. istanziando un solo oggetto della classe, posso scrivere e leggere da qualunque file senza vincoli (mi è venuto il dubbio...non è forse meglio farli statici a sto punto? Al costruttore alla fine non passo nulla)
Originariamente inviata da
andbin
public <T> List<T> deserializeItems(Class<T> aClass)
Ero partito anche io così, ma ho riscontrato un problema.
Quando vado a istanziare la classe, se provo a passare al metodo una classe diversa da quella utilizzata per la creazione, nemmeno mi compila.
Per intenderci:
codice:
ReaderWriter<Highscore> rw = new ReaderWriter<>();
rw.readElement(Highscore.class, "miofile.txt"); // fino qui tutto ok
rw.readElement(ClasseABC.class, "miofile.txt");//non mi compila nemmeno
Notato questo, sono arrivato alla soluzione sopra (anche se non mi convince troppo).
Adesso è così:
codice:
ReaderWriter<Object> rw = new ReaderWriter<>();
rw.readElement(Highscore.class, "miofile.txt");
rw.readElement(ClasseABC.class, "miofile.txt");
rw.readElement(ClasseABCDEF.class, "miofile.txt");
Quindi, ricapitolando.
Così può andare bene o c'è un errore concettuale di fondo? (Il fatto di istanziare la classe come ReaderWriter<Object> mi sembra un "trucco", non una soluzione)
Però se non scrivo "Object" dovrei istanziare un ReaderWriter per ogni classe, e se devo istanziare un ReaderWriter per ogni classe, inutile che gli passo una classe come parametro
Sarebbe meglio cambiare facendo diventare tutto statico?
Grazie