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ź.