how can I write many serializable objects to a single file and then read a few of the objects as and when needed?
-
The complete problem: i have to implement a B-Tree. I would create an object for each 'Node' and store it in the file. Now when i am using the b-tree later i would like to get the root and read the desired nodes only. – Anupam Aug 12 '10 at 19:11
-
You haven't said why you would do this. The reason I ask is that you might be mistakingly assuming this is faster or more efficient in some way when it is more likely to be just unnecessarily compilcated. If you have a few 100 MB of data it might start to be worth it, otherwise just read the entire structure into memory and access that. – Peter Lawrey Aug 12 '10 at 19:45
5 Answers
You'd have to implement the indexing aspect yourself, but otherwise this could be done. When you serialize an object you essentially get back an OutputStream
, which you can point to wherever you want. Storing multiple objects into a file this way would be straightforward.
The tough part comes when you want to read "a few" objects back. How are you going to know how to seek to the position in the file that contains the specific object you want? If you're always reading objects back in the same order you wrote them, from the start of the file onwards, this will not be a problem. But if you want to have random access to objects in the "middle" of the stream, you're going to have to come up with some way to determine the byte offset of the specific object you're interested in.
(This method would have nothing to do with synchronization or even Java per se; you've got to design a scheme that will fit with your requirements and environment.)

- 102,507
- 33
- 189
- 228
-
1So for eg. I write `1`, `2`, `3`, `4`. Would I have to read them in as `4`, `3`, `2`, `1`? It doesn't make sense to me to read them in `1`, `2`, `3`, `4` again. Could you please clarify? – ylun.ca Apr 05 '15 at 01:58
The writing part is easy. You just have to remember that you have to write all objects 'at once'. You can't create a file with serialized objects, close it and open it again to append more objects. If you try it, you'll get error messages on reading.
For deserializing, I think you have to process the complete file and keep the objects you're interested in. The others will be created but collected by the gc on the next occasion.

- 113,398
- 19
- 180
- 268
I'd use a Flat File Database (e. g. Berkeley DB Java Edition). Just write your nodes as rows in a table like:
Node
----
id
value
parent_id

- 37,264
- 20
- 99
- 131
To read more Objects from file:
public class ReadObjectFromFile {
public static Object[] readObject() throws IOException {
Object[] list = null;
try {
byte[] bytes = Files.readAllBytes(Paths.get("src/objectFile.txt"));
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
list = (Object[]) ois.readObject();
ois.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return list;
}
}

- 1