2010-08-12 22 views
12

Jak napisać wiele serializowalnych obiektów do jednego pliku, a następnie odczytywać kilka obiektów w razie potrzeby?pisanie wielu obiektów java do pojedynczego pliku

+0

Cały problem: Muszę zaimplementować drzewo B. Chciałbym utworzyć obiekt dla każdego "węzła" i zapisać go w pliku. Teraz, gdy korzystam z drzewa b później, chciałbym uzyskać root i odczytać tylko pożądane węzły. – Anupam

+0

Nie powiedziałeś, dlaczego to zrobiłeś. Powodem, dla którego pytam, jest to, że możesz błędnie założyć, że jest to w jakiś sposób szybsze lub bardziej efektywne, gdy jest bardziej prawdopodobne, że po prostu niepotrzebnie się komplikuje. Jeśli masz kilka 100 MB danych, może się to opłacać, inaczej po prostu odczytaj całą strukturę w pamięci i uzyskaj dostęp do niej. –

Odpowiedz

8

Sam musisz zaimplementować indeksowanie, ale w przeciwnym razie można to zrobić. Podczas serializacji obiektu zasadniczo odzyskujesz numer OutputStream, który można wskazać w dowolnym miejscu. Przechowywanie wielu obiektów w pliku w ten sposób byłoby proste.

Trudna część pojawia się, gdy chcesz odczytać "kilka" obiektów z powrotem. Jak chcesz wiedzieć, jak szukać pozycji w pliku, który zawiera konkretny obiekt, który chcesz? Jeśli zawsze czytasz obiekty z powrotem w takiej samej kolejności, w jakiej je zapisałeś, od początku pliku nie będzie to problemem. Ale jeśli chcesz mieć losowy dostęp do obiektów w "środku" strumienia, będziesz musiał wymyślić jakiś sposób określenia przesunięcia bajtowego konkretnego obiektu, który cię interesuje.

(Ta metoda nie ma nic wspólnego z synchronizacją lub nawet Java jako taką, musisz zaprojektować schemat, który będzie pasował do twoich wymagań i środowiska.)

+1

Tak na przykład. Piszę "1", "2", "3", "4". Czy musiałbym je czytać jako "4", "3", "2", "1"? Nie ma sensu ponownie czytać ich w "1", "2", "3", "4". Czy mógłbyś wyjaśnić? –

3

Pismo jest łatwe. Musisz tylko pamiętać, że musisz pisać wszystkie obiekty "naraz". Nie można utworzyć pliku z serializowanymi obiektami, zamknąć go i ponownie otworzyć, aby dołączyć więcej obiektów. Jeśli spróbujesz, otrzymasz komunikat o błędzie podczas czytania.

Do deserializacji, myślę, że musisz przetworzyć cały plik i zatrzymać obiekty, które cię interesują. Pozostałe zostaną utworzone, ale zebrane przez gc przy następnej okazji.

3

Bądź Object[] do przechowywania przedmiotów. To zadziałało dla mnie.

Powiązane problemy