Zapisywanie listy do pliku.

0

Cześć. Chciałem napisać swoją taką skarbonkę, która pokazuje mi zmianę stanu konta i dzień w którym miała ona miejsce. Obiekt listy zapisywałem do pliku. Jednak przy wczytywaniu drukuje mi tylko ostatnie wejście, zapomina o poprzednich. Nie mogę w żaden sposób znaleźć błędu. Zerknie ktoś?

class Zapis {
    private Operacje op = new Operacje();
    private GregorianCalendar gregorianCalendar = new GregorianCalendar();
    private Scanner scanner = new Scanner(System.in);
    private ArrayList<String> x = new ArrayList<String>();
    private Odczyt historia;
 
    public void test() throws IOException, ClassNotFoundException, NullPointerException {
        try {
        op.dzien = String.format("%tc", gregorianCalendar);
        op.kwota = scanner.nextInt();
        scanner.nextLine();
        op.naco = scanner.nextLine();
        int tablesize;
       tablesize = historia.array.size();
        for (int i = 0; i < tablesize; i++) {
            x.add("");
            x.set(i, historia.array.get(i));
        }
            x.add(toString());
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin"));
        objectOutputStream.writeObject(x);
        objectOutputStream.close();
        ;
        }catch (NullPointerException e){
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin"));
            op.dzien = String.format("%tc", gregorianCalendar);
            op.kwota = scanner.nextInt();
            x.add(op.toString());
            objectOutputStream.writeObject(x);
            objectOutputStream.close();
public class Odczyt {
 
    public static ArrayList<String> array;
 
    public void test() throws IOException, ClassNotFoundException {
        Zapis test2 = new Zapis();
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("costam.bin"));
        array = (ArrayList) objectInputStream.readObject();
        int k = array.size();
        for (int i = 0; i < k; i++) {
            System.out.println(array.get(i));
        }
        test2.test();
    }
}
0

@Edit
No taki połowiczny ten edid. Bardziej dodanie do poprzedniego postu, bo edytować go nie mogłem.

        int tablesize;
       tablesize = historia.array.size();
        for (int i = 0; i < tablesize; i++) {
            x.add("");
            x.set(i, historia.array.get(i));
        }

Myslalem, ze to zalatwi sprawę. No ale jednak nie:D

0

Przede wszystkim zrób porządek z kodem. Klasa powinna raczej nazywac się Skarbonka i mieć w osobnych metodach pobieranie danych z klawiatury, zapisywanie w pliku, odczytywanie z pliku i wypisywania. Nie potrzebnie jest osobna klasa do zapisu i odczytu bo jakiś dziwny chaos w tym powstaje.

Możesz ewentualnie zrobić klasę TestSkarbonka, w której wykorzystasz obiekt klasy Skarbonka np. mojaSkarbonka i będziesz wywoływac metody mojaSkarbonka.zapisz(), mojaSkarbonka.wczytaj(), mojaSkarbonka.pobierz_z_klawiatury(), mojaSkarbonka.wypisz().

0

Jeśli chcesz dopisywać, to:

new FileOutputStream("costam.bin",true)

Zaprzyjaźnij się z dokumentacją https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html

0

Z tego co widzę, to fizycznie wszystkie wejścia w pliku faktycznie się zapisują ale tablica *array *nie chce ich wczytać. Ignoruje pozostałe wejścia i wczytuje tylko pierwsze.

0

Jak wygląda Twój kod? Na pewno inaczej niż ten z pierwszego postu - on nie ma prawa działać.

0
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Scanner;

class Zapis {
    private Operacje op = new Operacje();
    private GregorianCalendar gregorianCalendar = new GregorianCalendar();
    private Scanner scanner = new Scanner(System.in);
    private ArrayList<String> x = new ArrayList<String>();
    private Odczyt historia = new Odczyt();

    public void test() throws IOException, ClassNotFoundException, NullPointerException {
        try {
            op.dzien = String.format("%tc", gregorianCalendar);
            op.kwota = scanner.nextInt();
            x.add(op.toString());
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin",true));
            objectOutputStream.writeObject(x);
            objectOutputStream.close();
            ;
        } catch (NullPointerException e) {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin",true));
            op.dzien = String.format("%tc", gregorianCalendar);
            op.kwota = scanner.nextInt();
            x.add(op.toString());
            objectOutputStream.writeObject(x);
            objectOutputStream.close();
        }
    }
}
import java.io.*;
import java.util.*;

public class Odczyt {

    public static ArrayList<String> array;

    public void test() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("costam.bin"));
        array = (ArrayList<String>) objectInputStream.readObject();
        int k = array.size();
        System.out.println(k);
        for (int i = 0; i < k; i++) {
            System.out.println(array.get(i));
        }
        objectInputStream.close();
    }
}
0

Musisz program zorganizować inaczej: nowe zapisy dodawaj do kolekcji ArrayList<String> i zapisuj całą kolekcję (bez dopisywania).

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Scanner;
 
class Zapis 
{
    private Operacje op = new Operacje();
    private GregorianCalendar gregorianCalendar = new GregorianCalendar();
    private Scanner scanner = new Scanner(System.in);
    private ArrayList<String> x = new ArrayList<String>();
    private Odczyt historia = new Odczyt();
 
    public void test() throws IOException, ClassNotFoundException, NullPointerException 
    {
        try 
        {
            historia.test();
            x = historia.array;
            op.dzien = String.format("%tc", gregorianCalendar);
            op.kwota = scanner.nextInt();
            x.add(op.toString());
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin"));
            objectOutputStream.writeObject(x);
            objectOutputStream.close();
        } 
        catch (NullPointerException e) 
        {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin"));
            op.dzien = String.format("%tc", gregorianCalendar);
            op.kwota = scanner.nextInt();
            x.add(op.toString());
            objectOutputStream.writeObject(x);
            objectOutputStream.close();
        }
    }
}

import java.io.*;
import java.util.*;
 
public class Odczyt 
{
 
    public ArrayList<String> array = new ArrayList<String>();
 
    public void test()
    {
        try
        {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("costam.bin"));
            array = (ArrayList<String>) objectInputStream.readObject();
            int k = array.size();
            System.out.println(k);
            for (int i = 0; i < k; i++) 
            {
                System.out.println(array.get(i));
            }      
            objectInputStream.close();
        }
        catch(FileNotFoundException e)
        {
            
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}
0

Zmieniłem to na coś takiego:

public class Wszystko {
    private static Operacje op = new Operacje();
    private static Scanner scanner = new Scanner(System.in);
    private static GregorianCalendar gregorianCalendar = new GregorianCalendar();
    private static ArrayList<String> array;

    public static void test() throws IOException, ClassNotFoundException {
        try {
            wczytaj();
            ustawOp();
            dodajDoArray();
            wydrukuj();
            zapisz();

        } catch (FileNotFoundException e) {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin"));
            op.dzien = String.format("%tc", gregorianCalendar);
            op.kwota = scanner.nextInt();
            array.add(op.toString());
            objectOutputStream.writeObject(array);
            objectOutputStream.close();
        }
    }

public static void wczytaj() throws IOException, ClassNotFoundException {
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("costam.bin"));
    array = (ArrayList<String>) objectInputStream.readObject();
}
public static void ustawOp(){ op.dzien = String.format("%tc", gregorianCalendar);
    op.kwota = scanner.nextInt();}
public static void dodajDoArray(){
    array.add(op.toString());}
public static void wydrukuj(){
    int s = array.size();
    for(int i =0; i<s; i++){
        System.out.println(array.get(i));
    }
}
public static void zapisz() throws IOException {
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("costam.bin",true));
    objectOutputStream.writeObject(array);
    objectOutputStream.close();}

}

Zdaje się być bardziej czytelne. Wydaje mi się, że zrobiłem tak jak mi kazałeś. Dodaje wejście do array i dopiero potem zapisuje plik. Wszystko działa jak powinno. Będzie działać dopóki nie zacznę w tym działać i ustawiać try i catch:D Dzięki wielkie bogdans. Ty od samego początku prowadziłeś mój "program" :P i pomogłeś mi go skończyć:D

0

Jeszcze jedno pytanie. Jest możliwość wyciągnięcia ostatniego wprowadzonego inta? To znaczy jeśli wydruk wygląda tak:

Kwota : 2000, Dzien: Pn lis 02 19:14:23 CET 2015 Na/Za: null
Kwota : 80000, Dzien: Pn lis 02 19:14:30 CET 2015 Na/Za: null

A chciałbym wyciągnąć stąd 80000 to w jaki sposób mógłbym to zrobić?

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