Zapisywanie i czytanie obiektów z pliku

0

Witam!

Mam problem z czytaniem zapisywanych danych z pliku. Chodzi o 2 metody: DataOutputStream oraz ObjectOutputStream.

  1. metoda DataOutputStream

Tak zapisuję:

case 11:
     
     DataOutputStream out = null;

        try {
          out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(
                  "listaDataOutput.bin")));
          
            for (k=0 ; k < ile_jest ; k++)
            {
                if(s[k] != null)
                {  
                    
                    out.writeUTF(s[k].imie);
                    out.writeUTF(s[k].nazwisko);
                    out.writeFloat(s[k].nrIndeksu);
       
                }
                
            }
          
        } finally {  out.close();     }
     
     
 break; 

A tak odczytuję, napotykając błędy:

 case 12:
     
     DataInputStream wejscie = null;

        try {
          wejscie = new DataInputStream(new BufferedInputStream(new FileInputStream(
                  "listaDataOutput.bin")));

          try {

                      s[ile_jest].imie = wejscie.readUTF();
                      s[ile_jest].nazwisko = wejscie.readUTF();
                      s[ile_jest].nrIndeksu = (int) wejscie.readFloat();
                      ile_jest++;
               
          } catch (EOFException e) {         }
       
        } finally {      wejscie.close();        }
        
for (k=0 ; k < ile_jest ; k++)
     {
         if(s[k] != null)
         {  s[k].wyswietl();  }
         else {System.out.println("brak studentow w bazie");}
         
     }
        
    
 break;

Błędy:
Exception in thread "main" java.lang.NullPointerException
at kamil_s.student.main(student.java:469)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)

  1. metoda ObjectOutputStream
case 13:
     
     String nazwaPliku = "listaObject.bin";
 
     ObjectOutputStream wyjscie = new ObjectOutputStream(
                           new BufferedOutputStream(
                             new FileOutputStream(nazwaPliku)));
     for (k=0 ; k < ile_jest ; k++)
     {
         if(s[k] != null)
         {  wyjscie.writeObject(s[k]);  }
         else {  System.out.println("brak studentow w bazie");   }
         
     }
     wyjscie.close();
 
 break;

Odczyt:

case 14:
     
 ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("listaObject.bin"));
   
        while((s[ile_jest]= (student) inputStream.readObject()) != null);
         {
              ile_jest++;
         }
          
     
inputStream.close();
 
 break; 

Błędy:
14
Exception in thread "main" java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at kamil_s.student.main(student.java:513)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

O ile w 1 metodzie muszę wiedzieć co zapisuję, żeby poprawnie odczytać, o tyle w drugie wydaje mi się, że skoro zapisuję bezpośrednio cały obiekt to również cały odczytuję. Jednak życie to nie bajka... :D Proszę o pomoc.

Dodam tylko, że pliki w które wrzucam dane nie są puste. Tzn. coś się jednak zapisuje.

0
          try {
                      s[ile_jest] = new NazwaOdpowiedniejKlasy();
                      s[ile_jest].imie = wejscie.readUTF();
                      s[ile_jest].nazwisko = wejscie.readUTF();
                      s[ile_jest].nrIndeksu = (int) wejscie.readFloat();
                      ile_jest++;
 
          } 
0

Tylko, że sprawa wygląda nieco inaczej. Otóż tablicę obiektów mam już stworzoną wcześniej, teraz chcę do niej to zapisać. Pomijamy fakt, że mam na stałe zadeklarowaną tablicę.

student s[] = new student[10];
0

Ale w tablicy masz same nulle. Po prostu dopisz

student s[] = new student[10];
for(int i=0;i<s.length;i++)
    s[i] = new student();

albo jakiś inny konstruktor (nie wiem jakie masz konstruktory).

0

Dziękuję. Teraz działa( pierwsza metoda). Druga na razie coś jest nie halo.

Już chyba wiem o co chodzi. Nie mam tej funkcji (przykład):

public String toString() {
    String adrPamięć = super.toString();
    return adrPamięć + "(" + miasto + ", " +
                             ulica + ", " +
                             nrDomu + ", " +
                             nrLokalu + ")";
  }

Dodałem to do klasy:

public String toString() {
        StringBuffer buffer = new StringBuffer();
        buffer.append(imie);
        buffer.append(nazwisko);
        buffer.append(nrIndeksu);
        buffer.append(ileOcen);
        buffer.append(oceny);
        return buffer.toString();
      }

Po operacji wczytywania otrzymuję:
java.io.EOFException
BUILD SUCCESSFUL (total time: 5 seconds)

Sama instrukcja case wygląda teraz:

case 14:
       
 ObjectInputStream wejscie2 = new ObjectInputStream(new FileInputStream("listaObject.bin"));
   try {
        while((s[ile_jest] = (student) wejscie2.readObject()) != null);
         {
              ile_jest++;
         }
           } catch (EOFException e) {  System.out.println(e);       }
 wejscie2.close();

 
for (k=0 ; k < ile_jest ; k++)
     {
         if(s[k] != null)
         {  s[k].wyswietl();  }
         else {System.out.println("brak studentow w bazie");}
         
     }

 break; 

Ajjj, człowiek całe życie uczy się na błędach. Warunek pętli jest zły.

Tylko jeszcze małe pytanko. Dlaczego po wywołaniu akurat tych funkcji wczytywania, program kończy działanie. zamiast czekać na cyfrę z klawiatury do dalszego wykonywania innych instrukcji?

1 użytkowników online, w tym zalogowanych: 0, gości: 1