Zapis i odczyt (plik). Problem z tablicą obiektów.

0

Witam, piszę program, w którym mam zapisywać tablicę obiektów do pliku i potem odczytywać je grupami (najpierw punkty, potem koła, walce i stożki). Gdy nie ma takich obiektów któregoś typu, to mam wyświetlić komunikat "Nie ma obiektów typu: " nazwa_obiektu.
Problem jest następujący - po uruchomieniu programu i wpisaniu czegokolwiek (to znaczy liczby typu int, ale niekoniecznie z zakresu 1 - 4 (pętla w switchu). tylko na przykład "5" przez całą pętlę) plik jest zapisywany na dysk (chyba poprawnie) i po odczytaniu (pętla "Wyświetlenie tablicy wczytanej z pliku.") dane wyglądają mniej więcej tak:

all[0] = Obiekt typu Punkt
all[1] = null
all[2] = Obiekt typu Kolo
all[3] = Obiekt typu Kolo
all[4] = null
all[5] = Obiekt typu Walec
all[6] = Obiekt typu Walec
all[7] = Obiekt typu Walec
all[8] = null
all[9] = Obiekt typu Stozek
all[10] = Obiekt typu Stozek
all[11] = Obiekt typu Stozek
all[12] = null
all[13] = null
all[14] = null

Jak już pisałem, choćbym nie wpisał żadnego punktu, koła, walca czy stożka, to ta tablica zawsze tak wygląda ("nulle" też), więc chyba nie ma nawet mowy (na przyszłość) o wyświetleniu komunikatu o braku obiektu danego typu, choć tego w kodzie nie pisałem.
Co zrobić, by nad tym zapanować, zlikwidować te puste elementy tablicy i żeby ona wyświetlała to, co chciałem jej wcześniej wpisać, ewentualnie gdzie dodać ten komunikat o braku danego obiektu?
KOD PROGRAMU:

import java.io.*;
import java.util.*;

public class Main implements Iterable, Serializable
{
 
 static ArrayList tab = new ArrayList(); //Domyślnie tworzy tablicę 10-elementową, można wpisać w parametrze inną wielkość.
 int size = tab.size();
 
 public Iterator iterator()
 {
     return new Iterator()
     {
         int position = 0;
         public boolean hasNext()
         {
             return position < size;
         }
         public Object next()
         {
             return tab.get(position++).toString();
         }
         public void remove()
         {
            throw new UnsupportedOperationException();
         }
     };
 }

 public static void main(String args[])
 throws IOException
 {   
    int wybor; 
    BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Wypełnij tablicę danymi figurami.");
    
    Punkt punkt = new Punkt(Math.random(), Math.random());
    Kolo kolo = new Kolo(Math.random());
    Walec walec = new Walec(Math.random(), Math.random());
    Stozek stozek = new Stozek(Math.random(), Math.random(), Math.random());
     
    for (int i = 0; i < 15; i++)
    {
        System.out.println("Wybierz: 1 - punkt, 2 - koło, 3 - stożek, 4 - walec.");
        
        String line = null;
               try{ 
                   line = brIn.readLine();
                }
               catch(IOException e){
                   System.out.println("Błąd odczytu strumienia.");
                   return;
                }
                
               try{
                   wybor = Integer.parseInt(line);
                }
               catch(NumberFormatException e){
                   System.out.println("Wprowadzona wartość nie jest liczbą całkowitą.");
                   return;
                }        
        switch(wybor)
        {
              case 1: {
                        tab.add(punkt);
                      }
              break;
              case 2: {
                        tab.add(kolo);
                      }
              break;
              case 3: {
                        tab.add(walec);
                      }
              break;
              case 4: {
                        tab.add(stozek);
                      }
              break;
              default: System.out.println("Nie ma figury o takim numerze."); break;     
        }
    }
    
    //Zapisywanie do pliku.
    try
            {
                FileOutputStream f = new FileOutputStream("dane.txt");
                ObjectOutputStream str = new ObjectOutputStream(f);
                str.writeObject(punkt);
                str.writeObject(kolo);
                str.writeObject(walec);
                str.writeObject(stozek);
                //punkt jest zapisywanym obiektem //było "ob"
                str.flush();  //Powoduje opróżnienie bufora.
                f.close();
            }
            catch(IOException e)
            {
                System.out.println("Błąd wejścia/wyjścia.");
             //   JOptionPane.showMessageDialog(lista,e.getMessage(),"Pisanie do pliku "+nameOfFile,JOptionPane.INFORMATION_MESSAGE);
            } 
    
    //Odczyt danych z pliku.
    Object all[] = new Object[15];
    try
            {
                FileInputStream f = new FileInputStream("dane.txt");
                ObjectInputStream ois = new ObjectInputStream(f);
                
                for(int i = 0; i < 15; i++)
                  {
                   Object ob = ois.readObject();
                
                    if (ob instanceof Punkt)
                    {
                        all[i++] = (Punkt)(ob);
                    }
                    if (ob instanceof Kolo)
                    {
                        all[i++] = (Kolo)(ob);
                    }
                    if (ob instanceof Walec)
                    {
                        all[i++] = (Walec)(ob);
                    }
                    if (ob instanceof Stozek)
                    {
                        all[i++] = (Stozek)(ob);
                    }
                  }
            }
            catch(Exception e) //A nie IOException?
            {
               System.out.println("Błąd wejścia/wyjścia.");
              // JOptionPane.showMessageDialog(null,e.getMessage(),"Czytanie pliku "+nameOfFile,JOptionPane.INFORMATION_MESSAGE);
              // lista=new List();
            }
    
    int indeks = 0;
    System.out.println("\nWyświetlenie tablicy elementów.\n");
    for(Object o: tab)
    {
        System.out.println("a[" + indeks + "] = " + o.toString());
        indeks++;
    }
            
    System.out.println("\nWyświetlenie tablicy wczytanej z pliku.\n");
    for (int ind = 0; ind < 15; ind++)
    {
        System.out.println("all[" + ind + "] = " + all[ind]);   
    }
  
/* tab.remove(3); //Usuwa element o indeksie 3.
   indeks = 0;
   System.out.println("\nWyświetlenie tablicy po usunięciu elementu o indeksie 3.\n");
   for(Object o: tab)
    {
        System.out.println("a[" + indeks + "] = " + o.toString());
        indeks++;
    }
  */
 }
}

Chciałbym zaznaczyć, że problemy z tym programem zgłaszałem już tu na forum http://4programmers.net/Forum/427086?h=zap%C4%99tlenie#id427086
(i pomogli mi bogdans oraz gzrewal, za co dziękuję), ale teraz problem już sporo odbiega od tego, z czym miałem problem wtedy, więc założyłem nowy temat.
Przy okazji - możecie zobaczyć, jak kod ewoluował dzięki wyżej wymienionym osobom. :-)
Z góry dziękuję za odpowiedź.

0
  1. Tworzenie tablicy. Skoro losujesz parametry figur, to domyślam się,że chcesz mieć w tablicy różne Punkty,Walce itp. Jeśli tak, to kod powinien wyglądać inaczej:
Punkt punkt;
.....
for(int i=0;i<15;i++)
{
    ....
    switch(wybor)
    {
         case 1:
            punkt=new Punkt(Math.random(),Math.random());           
            tab.add(punkt);
            break;        
    }    
} 
  1. Zapisywania zupełnie nie rozumiem
  2. Odczyt możesz zmienić tak:
  //zadeklaruj w metodzie main() zmienne
  int punkty=0;
  int walce=0;
  ...... 
                FileInputStream f = new FileInputStream("dane.txt");
                ObjectInputStream ois = new ObjectInputStream(f);
                for(int i = 0; i < 15; i++)
                  {
                   Object ob = ois.readObject();
               
                    if (ob instanceof Punkt)
                    {
                        all[i] = (Punkt)(ob);
                        punkty++;
                    }
                    if (ob instanceof Kolo)
                    {
                        all[i] = (Kolo)(ob);
                        kola++;
                    }
                    if (ob instanceof Walec)
                    {
                        all[i] = (Walec)(ob);
                        walce++;
                    }
                    if (ob instanceof Stozek)
                    {
                        all[i] = (Stozek)(ob);
                        stozki++;
                    }
                  }

0

Dzięki za wskazówki, zastosowałem je (zmieniłem sposób tworzenia tablicy - faktycznie lepiej jest, gdy wszystkie elementy są różne ;-) oraz odczyt danych z pliku) wg Twoich wskazówek, bogdans.
Jest jeszcze sprawa zapisu do pliku - ten kod mam od Ciebie, tylko przerobiłem go trochę na swoją modłę, więc pewnie dlatego "nie wiesz, co tam się dzieje". ;-P
Domyślam się, że powinno to wyglądać coś w podobie tego:

 //Zapisywanie do pliku.
    try
            {
                FileOutputStream f = new FileOutputStream("dane.txt");
                ObjectOutputStream str = new ObjectOutputStream(f);
                Object ob;
                str.writeObject(ob);
             /*   str.writeObject(punkt);
                str.writeObject(kolo);
                str.writeObject(walec);
                str.writeObject(stozek);
              */  //punkt jest zapisywanym obiektem //było "ob"
                str.flush();  //Powoduje opróżnienie bufora.
                f.close();
            }
            catch(IOException e)
            {
                System.out.println("Błąd wejścia/wyjścia.");
             //   JOptionPane.showMessageDialog(lista,e.getMessage(),"Pisanie do pliku "+nameOfFile,JOptionPane.INFORMATION_MESSAGE);
            }

Czyli zamiast

str.WriteObject(punkt); //kolo, walec czy stozek

powinno być

str.WriteObject(ob);

Tylko wtedy muszę stworzyć obiekt ob:

Object ob;

Jednak nie bardzo wiem, jak go zainicjować.
Ewentualnie on nie powinien być w pętli, tylko zadeklarowany przed pętlą...
Będę wdzięczny za wskazówki. [green]

0

Poniższe rozwiązanie ignoruje wybór spoza zakresu 1-4

import java.io.*;
import java.util.*;

public class Test
{
    static ArrayList tab = new ArrayList();
    int size = tab.size();            
    //------------------------
    public static void main(String args[]) throws IOException
    {
        FileOutputStream f = new FileOutputStream("dane.txt");
        ObjectOutputStream str = new ObjectOutputStream(f);
        try
        {
            f = new FileOutputStream("dane.txt");
            str = new ObjectOutputStream(f);
        }
        catch(IOException e)
        {
            System.out.println("Błąd wejścia/wyjścia.");
            return;
        }
        int wybor;
        BufferedReader brIn = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Wypełnij tablicę danymi figurami (15).");

        Object ob=new Object();

        for (int i=0;i<15;i++)
        {
            System.out.println("("+(i+1)+")Wybierz: 1 - punkt, 2 - koło, 3 - stożek, 4 - walec.");

            String line;
            try
            {
                line = brIn.readLine();
            }
            catch(IOException e)
            {
                System.out.println("Błąd odczytu strumienia.");
                return;
            }

            try
            {
                wybor = Integer.parseInt(line);
            }
            catch(NumberFormatException e)
            {
                System.out.println("Wprowadzona wartość nie jest liczbą całkowitą.");
                return;
            }
            switch(wybor)
            {
              case 1:
                ob=new Punkt(Math.random(), Math.random());
                tab.add(ob);
                break;
              case 2:
                ob=new Kolo(Math.random());
                tab.add(ob);
                break;
              case 3:
                ob=new Walec(Math.random(), Math.random());
                tab.add(ob);
                break;
              case 4:
                ob=new Stozek(Math.random(), Math.random(), Math.random());
                tab.add(ob);
                break;
              default: System.out.println("Nie ma figury o takim numerze.");
                i--;
                break;
            }
            if(wybor>=1 && wybor<=4)
            {
                str.writeObject(ob);
            }
        }
        //Zamknięcie pliku
        try
        {
            str.flush();  //Powoduje opróżnienie bufora.
            f.close();
        }
        catch(IOException e)
        {
            System.out.println("Błąd wejścia/wyjścia.");
            return;
        }

        //Odczyt danych z pliku.
        Object all[] = new Object[15];
        int punkty=0;
        int kola=0;
        int walce=0;
        int stozki=0;
        try
        {
            FileInputStream input = new FileInputStream("dane.txt");
            ObjectInputStream ois = new ObjectInputStream(input);

            for(int i=0;i<15;i++)
            {
                ob = ois.readObject();

                if (ob instanceof Punkt)
                {
                    all[i] = (Punkt)(ob);
                    punkty++;
                }
                if (ob instanceof Kolo)
                {
                    all[i] = (Kolo)(ob);
                    kola++;
                }
                if (ob instanceof Walec)
                {
                    all[i] = (Walec)(ob);
                    walce++;
                }
                if (ob instanceof Stozek)
                {
                    all[i] = (Stozek)(ob);
                    stozki++;
                }
            }
        }
        catch(Exception e) //A nie IOException?
        {
            System.out.println("Błąd wejścia/wyjścia.");
        }

        int indeks = 0;
        System.out.println("\nWyświetlenie tablicy elementów.\n");
        for(Object o: tab)
        {
            System.out.println("a[" + indeks + "] = " + o.toString());
            indeks++;
        }

        System.out.println("\nWyświetlenie tablicy wczytanej z pliku.");
        System.out.println("Punkty "+punkty);
        System.out.println("Kola "+kola);
        System.out.println("Walce "+walce);
        System.out.println("Stozki "+stozki);
        for (int i=0;i<15;i++)
        {
            System.out.println("all[" + i + "] = " + all[i]);
        }

    }
}

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