• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

java jak dopisac obiekt do pliku i odczytac robiąc listę

0 głosów
62 wizyt
pytanie zadane 15 marca w Java przez Lulex Użytkownik (540 p.)

Cześć.

Utworzyłem sobie listę obiektów typu Airplane

List<Airplane> listOfAirplanes = new ArrayList<>();

Chcę sobie zrobić obsługę odczytu i zapisu do pliku. Z pomocą internetu wytworzyłem takie coś:


public static void printToFile(Airplane airplane){
        try {
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(airplane);
            oos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void readFromFileAndAddToList(List<Airplane> listOfAirplanes){
        try{
            FileInputStream fis = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(fis);
            Airplane airplaneFromFile = (Airplane) ois.readObject();
            System.out.println(airplaneFromFile);
            listOfAirplanes.add(airplaneFromFile);
            ois.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

W jaki sposób mogę zrobić aby printToFile dopisywało na końcu pliku a nie kasowało jego zawartość? Na Stringach to robiłem BufferedWriterem ale tutaj już nie moge sobie poradzić. Chciałbym też aby można było zainicjalizować listę odczytując te samoloty z pliku - tutaj to już kompletnie nie wiem jak

1 odpowiedź

0 głosów
odpowiedź 15 marca przez Wiciorny Mędrzec (176,870 p.)
komentarz 16 marca przez Lulex Użytkownik (540 p.)

Dzięki, troche pomogło, ale coś nie gra dalej. Wytworzyłem ogólnie coś takiego:

public static List<Airplane> createListFromFile() throws ClassNotFoundException, IOException {
        List<Airplane> listofAirplane = new ArrayList<>();
        FileInputStream fileStream = new FileInputStream(FILE_PATH);
        ObjectInputStream input = new ObjectInputStream(fileStream);
        while (fileStream.available() != 0) {
            Airplane airplane = (Airplane) input.readObject();
            if (airplane != null) {
                System.out.println(airplane);
                listofAirplane.add(airplane);
            }
        }
        return listofAirplane;
    }

 

Co ciekawe, odczytuje pierwszy obiekt jednak potem wyrzuca błąd 

Exception in thread "main" java.io.StreamCorruptedException: invalid type code: AC

komentarz 16 marca przez Wiciorny Mędrzec (176,870 p.)

ObjectInputStream - otwierasz do operacji na obiekcie, ale nie zamykasz 
musisz zamknąc operacje serializowane 
Sczególnie jeśli np korzystasz z 

 ObjectOutputStream

u Ciebie jest akurat Input, tak ... ale to bardzo istotna kwestia
https://www.tutorialspoint.com/java/io/objectinputstream_close.htm

komentarz 16 marca przez Lulex Użytkownik (540 p.)
Czuje sie jakiś specjalny, bo nie moge tego zrobić aby działało XD

wrzucam input.close() na końcu metody nie działa, wrzucam to w pętli while - też nie działa
komentarz 16 marca przez Wiciorny Mędrzec (176,870 p.)
edycja 16 marca przez Wiciorny

Podstawowy problem polega na tym, że używasz nowego ObjectOutputStream do zapisu w strumieniu, w którym był już używany poprzedni ObjectOutputStream do zapisu. Te strumienie mają nagłówki, które są zapisywane i odczytywane przez odpowiednie konstruktory, więc jeśli utworzysz kolejny ObjectOutputStream, napiszesz nowy nagłówek, który zaczyna się od - np - 0xAC, a istniejący ObjectInputStream nie oczekuje w tym momencie kolejnego nagłówka, więc działa.

Nie wiem gdzie dodawałeś input.close() w pętli while, ale powinno to być zaraz po dodaniu elementu. ( zanim zostanie wczytany kolejny  obiekt), to jednak spowoduje, ze nie bedzie kolejnej inicjalizacji która byc nie może spróbuj w takim razie w momencie zanim odwołasz się do wczytania kolejnego obiektu zrobić 
 

input.reset();


https://www.tutorialspoint.com/java/io/objectoutputstream_reset.htm
Ahh teraz widze 
 

 Airplane airplane = (Airplane) input.readObject();

wczytujesz 1 obiekt, a nie liste? Wiec dalej nic nie ma ... jeśli chcesz wczytac liste to powinieneś to zmapowac 
 

(List<Airplane>) input.readObject();

 

Podobne pytania

0 głosów
0 odpowiedzi 461 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
2 odpowiedzi 669 wizyt
pytanie zadane 26 maja 2015 w PHP przez TomWaw.IT Użytkownik (920 p.)
0 głosów
1 odpowiedź 79 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

85,212 zapytań

134,029 odpowiedzi

297,158 komentarzy

56,309 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...