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 1923 CET 2015 Na/Za: null
Kwota : 80000, Dzien: Pn lis 02 1930 CET 2015 Na/Za: null

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

0

Mozesz literowac i wyciągać fragment od : do przecinka. Ale to chyba nieefektywneX D

0

Trochę zmień koncepcje, i serializuj obiekt typu ArrayList<Operacje>. W istniejącym kodzie wystarczy chyba jedna zmiana (poza, oczywiście, deklaracjami zmiennych):

public static void dodajDoArray()
{
    array.add(op);
}

Wtedy ostatni wprowadzony int to

array.get(array.size()-1).kwota;
0
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<Operacje> array = new ArrayList<Operacje>();

    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);
            objectOutputStream.writeObject(array);
            objectOutputStream.close();
        }
    }

public static void wczytaj() throws IOException, ClassNotFoundException {
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("costam.bin"));
    array = (ArrayList<Operacje>) objectInputStream.readObject();
}

    public static void ustawOp(){ op.dzien = String.format("%tc", gregorianCalendar);
    op.kwota = scanner.nextInt();
    scanner.nextLine();
    op.naco=scanner.nextLine();}

    public static void dodajDoArray(){
    array.add(op);}

    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"));
    objectOutputStream.writeObject(array);
    objectOutputStream.close();}

}

Przy takim kodzie dzieją się różne cuda niewidy. Dodałem do klasy Operacje implementacje Serializable, ale przy próbie dodawania nowych elemtów wyskakuje mi błąd

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at Wszystko.wydrukuj(Wszystko.java:51)
at Wszystko.test(Wszystko.java:22)
at Main.main(Main.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

A przy tym drukuje się pierwsze i ostatnie wejście. Jeśli stworzyłem plik z wejściem 3000, to ta wartość za każdym razem będzie się pokazywać, a druga natomiast będzie zależna od poprzedniego wejścia. No teraz to mi mózgł wybuchł

0

Dlaczego tu

    public static void wydrukuj(){
    int s = array.size();
    for(int i =0; i<=s; i++){
        System.out.println(array.get(i));
    }

jest nierówność nieostra?
Dlaczego taka absurdalna kolejność instrukcji?

            ustawOp();
            dodajDoArray();

W bloku kodu wykonywanym gdy nie ma jeszcze pliku costam.bin

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

brakuje pytania, na co są te pieniądze.

0
  1. Nierówność nieostra przez moją nieuwagę, przy poprzednich błędach kombinowałem i zapomniałem zmienić. Poprawienie tego załatwiło sprawię błędu.
  2. Kolejność instrukcji wydawała i wydaję mi się być cały czas odpowiednia. Najpierw muszę ustawić kwotę i za co/na co była przeznaczona a dopiero potem przypisać je do tablicy, prawda? Gdzie się zgubiłem?
  3. Uznałem to za wartość startową, wiec zostawiłem wartość domyślną.
  4. Do całego programu dodalem meu:
    public static void menu() throws IOException {
        Wszystko wszystko = new Wszystko();
        Scanner scanner = new Scanner(System.in);
        do {
        System.out.println("1 => Dodaj nowy");
        System.out.println("2 => Historia");
        System.out.println("3 => EXIT");
            int choice = scanner.nextInt();
            switch (choice) {
                case 1:
                    wszystko.zapisz();
                    break;
                case 2:
                    wszystko.wydrukuj();
                    break;
                case 3:
                    System.exit(1);
                    break;
            }
        } while (true);
    }

I wszystko śmiga. Już tego nie ruszam bo znowu popsuje:D wielkie dzięki:D

0

A jednak nie wszystko. Przy uruchamianiu pliku w wierszu poleceń wyskakuje mi błąd. Pogooglowałem i dowiedziałem się, że za to jest odpowiedzialny zly zapis ArrayList, który powinien wyglądać tak: ArrayList<> name = new ArrayList<>();
Tylko, że u mnie to tak wygląda. Więc nie mam pojęcia czego to może być wina.
user image

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<Operacje> array = new ArrayList<Operacje>();
    
    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);
            objectOutputStream.writeObject(array);
            objectOutputStream.close();
        }
    }

public static void wczytaj() throws IOException, ClassNotFoundException {
    ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("costam.bin"));
    array = (ArrayList<Operacje>) objectInputStream.readObject();
}

    public static void ustawOp(){ op.dzien = String.format("%tc", gregorianCalendar);
    System.out.println("Wpisz kwote:");
    int a = array.get(array.size()-1).kwota;
    op.kwota = a + scanner.nextInt();
    scanner.nextLine();
    System.out.println("Wprowadz za/na co:");
    op.naco=scanner.nextLine();}

    public static void dodajDoArray(){
    array.add(op);}

    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"));
    objectOutputStream.writeObject(array);
    objectOutputStream.close();}

}

0

Pierwszych dwóch linijek błędu się pozbyłem, gdzieś tam zaimportowało mi się nie to co trzeba. ale wciąż zostało to co najważniejsze.
user image

0

Ten warning jest chyba niemożliwy do usunięcia. Musisz go polubić, wynika on z tego, że metoda readObject() zwraca zmienną typu Object. Nie wiadomo czy da się ją rzutować na typ ArrayList<Operacje>. Standardowe sposoby uniknięcia "warninga":

Object object = objectOutputStream.readObject();

try
{
    array = (ArrayList<Operacje>) object;
}
catch(ClassCastException e)
{
    System.out.println(e);
}
//lub
if(object instanceof ArrayList<Operacje>)
{
    array = (ArrayList<Operacje>) object;
}

nie działają.

0

Skoro nie dzialaja to jak w prawidłowy sposob uruchomić program?

0

Tak jak uruchamiasz java Main, komunikat to tylko ostrzeżenie kompilatora, które spokojnie można zignorować.

0

Dzięki po raz setny! :)

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