• 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
621 wizyt
pytanie zadane 15 marca 2021 w Java przez Lulex Użytkownik (820 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 2021 przez Wiciorny Ekspert (281,250 p.)
komentarz 16 marca 2021 przez Lulex Użytkownik (820 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 2021 przez Wiciorny Ekspert (281,250 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 2021 przez Lulex Użytkownik (820 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 2021 przez Wiciorny Ekspert (281,250 p.)
edycja 16 marca 2021 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 842 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
2 odpowiedzi 1,158 wizyt
pytanie zadane 26 maja 2015 w PHP przez TomWaw.IT Użytkownik (920 p.)
0 głosów
1 odpowiedź 170 wizyt

93,424 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...