¡Arreglado! Dejo la solución para gente que tenga el mismo problema en el futuro. Gracias a elKaoD por los consejos, sin ellos no habría conseguido hacerlo xD:
Escritura:
try{
// Definimos el archivo
File arch = new File("NoteList.txt");
/*
IMPORTANTE: Esto es tal que, si el archivo existe, utilizamos una clase propia (que os facilito luego) que es básicamente una sobreescritura de uno de los métodos de ObjectOutputStream, que deja escribir al final del fichero. Si no, utilizamos la clase básica, para que pueda poner cabecera (lo cual es necesario).
*/
if(arch.exists()){
AppendableObjectOutputStream oos = new AppendableObjectOutputStream(new FileOutputStream(arch, true));
// Recordad utilizar writeUnshared!
oos.writeUnshared(nota);
oos.close();
} else {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(arch, true));
oos.writeUnshared(nota);
oos.close();
}
Clase ObjectOutputStream propia:
public class AppendableObjectOutputStream extends ObjectOutputStream {
public AppendableObjectOutputStream(OutputStream out) throws IOException {
super(out);
}
@Override
protected void writeStreamHeader() throws IOException {
// do not write a header, but reset:
// this line added after another question
// showed a problem with the original
reset();
}
}
Método de lectura:
try{
// Instanciamos nuestro ObjectInputstream con el archivo en el que hemos escrito.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("NoteList.txt"));
try {
/*
AVISO: Esto es un poco chapuzas, pero no encontré nada mejor. Poned como límite un número alto que sepáis que no vaya a ser alcanzado, y listo. He probado con el while(ois.readObject!=null) y da problemas tales como sólo leer uno de cada 2 objetos, así que por ahora creo que este es el más acertado.
Como nota, también podéis hacer un archivo de texto donde tengáis un simple número que indique cuantos objetos hay escritos, y exportarlo aquí, en caso de que queráis romperos un poco más la cabeza y queráis un programa más escalable xD.
*/
for(int i=0;i<500;i++){
Object obj = ois.readObject();
if(obj instanceof Note){
Note not = (Note) obj;
/* Llegados a este punto, ya tenemos el objeto listo para ser usado. Yo, por ejemplo, lo añado a una tabla.*/
tabla.agregarNota(not);
table.setModel(tabla);
allNotes.put(i, not);
}
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(NotesFrame.class.getName()).log(Level.SEVERE, null, ex);
}ois.close();
} catch(IOException excp){
System.out.println(excp.getMessage());
}