Avatar billede Godfather75 Nybegynder
19. oktober 2012 - 11:00 Der er 17 kommentarer og
1 løsning

Vedr. Objectinputstream

Hvordan læser man en fil med mange objekter med objectinputstream?
Avatar billede arne_v Ekspert
19. oktober 2012 - 11:04 #1
Kalder readObject flere gange.

:-)

Proev og forklarf hvad problemet er.
Avatar billede Godfather75 Nybegynder
19. oktober 2012 - 14:59 #2
Jeg har lavet en GUI hvor brugeren kan indtaste nogle parameter. Når trykker på gem. Gemmes oplysningerne som et object. her er min  ActionListener fra gui.
private    class ButtonHandler implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
           
                if ( e.getSource()==btnGem){
                   
                    try {
                       
                        el = new EL(ElMånedeField.getText(),ElÅrField.getText(),
Double.parseDouble(ElMåleAfTextField.getText()),Double.parseDouble(ElFaktiskField.getText()));
                   
                   
                    String outputMM = sdf1.format(date1);
                    String outputYY = sdf2.format(date2);
                   
                    if (!el.getMåneder().equals(outputMM) ){
                        JOptionPane.showMessageDialog(null,"Ukendt Månede ?","Inane error",JOptionPane.ERROR_MESSAGE);
                    }else if(!el.getYear().equals(outputYY)){
                        JOptionPane.showMessageDialog(null,"Ukendt År ?","Inane error",JOptionPane.ERROR_MESSAGE);
                    }else{
                        System.out.println(el);
                        save = new ObjectStreamHandler();
                        save.saveObject(el,outputYY);
                       
                    }
                       
                    } catch (NumberFormatException e1) {
                        JOptionPane.showMessageDialog(null,"Ukendt format ?","Inane error",JOptionPane.ERROR_MESSAGE);
                  }
              }
        }
    }

Her er min class der skal gemme og læse objectet tilbage:
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import javax.swing.JOptionPane;


public class ObjectStreamHandler {
    private ObjectOutputStream outputStream;
    private ObjectInputStream ois;
    private ArrayList<Object>energi;
   
    public void saveObject(Object o,String fileName){
    try {
        outputStream = new ObjectOutputStream(new FileOutputStream(fileName+".dat",true));
       
        outputStream.writeObject(o);
        outputStream.flush();
        outputStream.close();
        JOptionPane.showMessageDialog(null,"File saved","Information",JOptionPane.INFORMATION_MESSAGE);
       
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
    }

    public void loadObject(String fileName){
       
       
            try {
                FileInputStream fis = new FileInputStream(fileName+".dat");
               
                ois = new ObjectInputStream(fis);
           
           
                energi = new ArrayList<Object>();
           
               
                Object object;
                try {
               
               
                while ((object =ois.readObject())!= null)
                {
                   
                    energi.add(object);
                   
// her får jeg kun udskrevet den første objekt? men jeg vil gerne havde dem alle udskrevet? og lagt dem til et arrayList           
               
           
                   
                   
                   
                   
                    }
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("Hello");
                try {
                    ois.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            String output="";
            for(int i=0;i<energi.size();i++){
               
                output =energi.get(i)+"";
            }
            System.out.println(output);
    }       
       
}       

Når brugeren ønsker at se alle sine indtastning (History) skal han bruge en JComboBox. Her har du min comboActionListener:

private class ComboHandler implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
    String file = "12";
    if(    comboBox.getSelectedItem().equals("2012")){

        load = new ObjectStreamHandler();
        load.loadObject(file);
       
    }
       
    }
   
}
Avatar billede arne_v Ekspert
20. oktober 2012 - 17:25 #3
open write
writeObject
writeObject
writeObject
close

open read
readObject
readObject
readObject
close

boer virke.

Jeg er ikke overrasket over at:

open append
writeObject
close
open append
writeObject
close
open append
writeObject
close

open read
readObject
readObject
readObject
close

ikke virker.
Avatar billede arne_v Ekspert
20. oktober 2012 - 17:26 #4
Proev evt. at gemme en ArrayList med alle dine objekter fremfor de enkelte objekter.
Avatar billede arne_v Ekspert
20. oktober 2012 - 22:52 #5
Hm.

Open, skriv og luk virker faktisk.
Avatar billede arne_v Ekspert
20. oktober 2012 - 22:53 #6
package october;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

public class SaveAndLoad {
    private static final String FNM = "C:\\test.dat";
    public static void test1() throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FNM));
        oos.writeObject("A");
        oos.writeObject("BB");
        oos.writeObject("CCC");
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FNM));
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        ois.close();
    }
    public static void save2(Object o) throws FileNotFoundException, IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FNM, true));
        oos.writeObject(o);
        oos.close();
    }
    public static void test2() throws FileNotFoundException, IOException, ClassNotFoundException {
        save2("A");
        save2("BB");
        save2("CCC");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FNM));
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
        ois.close();
    }
    public static void save3(Object o) throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FNM));
        ArrayList<Object> lst = (ArrayList<Object>) ois.readObject();
        ois.close();
        lst.add(o);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FNM));
        oos.writeObject(lst);
        oos.close();
    }
    public static void test3() throws FileNotFoundException, IOException, ClassNotFoundException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FNM));
        oos.writeObject(new ArrayList<String>());
        oos.close();
        save3("A");
        save3("BB");
        save3("CCC");
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FNM));
        ArrayList<Object> lst = (ArrayList<Object>) ois.readObject();
        ois.close();
        System.out.println(lst.get(0));
        System.out.println(lst.get(1));
        System.out.println(lst.get(2));
    }
    public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        test1();
        test2();
        test3();
    }
}
Avatar billede Godfather75 Nybegynder
20. oktober 2012 - 22:53 #7
Hej arne_v :-)
Jeg har prøvet at ændre min ActionListener:
private    class ButtonHandler implements ActionListener{

            @Override
            public void actionPerformed(ActionEvent e) {
           
                if ( e.getSource()==btnGem){
                   
                    try {
                       
                        el = new EL(ElMånedeField.getText(),ElÅrField.getText(),Double.parseDouble(ElMåleAfTextField.getText()),Double.parseDouble(ElFaktiskField.getText()));
                        elObjectsCollector = new ArrayList<Object>();
                   
                    String outputMM = sdf1.format(date1);
                    String outputYY = sdf2.format(date2);
                   
                    if (!el.getMåneder().equals(outputMM) ){
                        JOptionPane.showMessageDialog(null,"Ukendt Månede ?","Inane error",JOptionPane.ERROR_MESSAGE);
                    }else if(!el.getYear().equals(outputYY)){
                        JOptionPane.showMessageDialog(null,"Ukendt År ?","Inane error",JOptionPane.ERROR_MESSAGE);
                    }else{
                   
                        elObjectsCollector.add(el);
                        save = new ObjectStreamHandler();
                        save.saveObject(elObjectsCollector,outputYY);
                       
                    }
                       
                    } catch (NumberFormatException e1) {
                        JOptionPane.showMessageDialog(null,"Ukendt format ?","Inane error",JOptionPane.ERROR_MESSAGE);
                       
                    }
                   
                }
                   
                }
           
            }

Og min loadObject metode fra class ObjectStreamHandler :
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;


public class ObjectStreamHandler {
    private ObjectOutputStream outputStream;
    private ObjectInputStream ois;
    private ArrayList<Object>energi;
   
    public void saveObject(Object o,String fileName){
    try {
        outputStream = new ObjectOutputStream(new FileOutputStream(fileName+".dat",true));
       
        outputStream.writeObject(o);
        outputStream.flush();
        outputStream.close();
        JOptionPane.showMessageDialog(null,"File saved","Information",JOptionPane.INFORMATION_MESSAGE);
       
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
    }
   
    public void loadObject(String fileName){
       
       
            try {
                FileInputStream fis = new FileInputStream(fileName+".dat");
               
                ois = new ObjectInputStream(fis);
           
           
                energi = new ArrayList<Object>();
           
   
               
               
                while(true){
                    try {
                       
                       
                        energi.add(ois.readObject());
                        ois.reset();       
                    } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
           
               
           
           
           
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("End of file");
                try {
                    ois.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            String output="";
            for(int i=0;i<energi.size();i++){
               
                output =energi.get(i)+"";
            }
            System.out.println(output);
    }       
       
}       

       
Men har stadigvæk samme problem.. den skriver kun den første object ud? og hvorfor hopper den hele tiden ned i IOException?
Avatar billede arne_v Ekspert
20. oktober 2012 - 22:53 #8
men:

while ((object =ois.readObject())!= null)

virker vist ikke.

Jeg fik ihvertfald en exception ved EOF.
Avatar billede Godfather75 Nybegynder
21. oktober 2012 - 00:25 #9
Test 3 kan du simpel gøre den lidt mere? Hvorfor laver du en  oos.writeObject(new ArrayList<String>());?
Avatar billede arne_v Ekspert
21. oktober 2012 - 09:27 #10
while(true){
                    try {
                     
                     
                        energi.add(ois.readObject());
                        ois.reset();     
                    } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

ligner en uendelig loekke.
Avatar billede Godfather75 Nybegynder
21. oktober 2012 - 11:18 #11
Hej arne_v Jeg har fået programmet til at virke med ArrayList, men det er stadigvæk et problem med at gemme til filen.
Fordi fx. hvis brugeren lukker programmet ned og ønsker senere i fremtiden at indtaste nye data ind i filen. så overskriver den jo arrayet. Og de gamle oplysninger er gået tabt.. hvordan kan jeg lave det sådan at den husker de gamle data med objectStream?
Her er et lille udsnit af mit program som det ser ud nu efter de nye ændringer:

Min ActionListener:

@Override
            public void actionPerformed(ActionEvent e) {
           
                if ( e.getSource()==btnGem){
                   
                    try {
                       
                        el = new EL(ElMånedeField.getText(),ElÅrField.getText(),Double.parseDouble(ElMåleAfTextField.getText()),Double.parseDouble(ElFaktiskField.getText()));
                       
                   
                    String outputMM = sdf1.format(date1);
                    String outputYY = sdf2.format(date2);
                   
                    if (!el.getMåneder().equals(outputMM) ){
                        JOptionPane.showMessageDialog(null,"Ukendt Månede ?","Inane error",JOptionPane.ERROR_MESSAGE);
                    }else if(!el.getYear().equals(outputYY)){
                        JOptionPane.showMessageDialog(null,"Ukendt År ?","Inane error",JOptionPane.ERROR_MESSAGE);
                    }else{
                       
                        elObjectsCollector.add(el);
                        System.out.println(elObjectsCollector);
                        save = new ObjectStreamHandler();
                        save.saveObject(elObjectsCollector,outputYY);
// arrayet og filenavn sendes videre til metoden saveObject                   
                    }
                       
                    } catch (NumberFormatException e1) {
                        JOptionPane.showMessageDialog(null,"Ukendt format ?","Inane error",JOptionPane.ERROR_MESSAGE);
                       
                    }
                   
                }
                   
                }
           
            }
Min ObjectStreamHandler klasse read/write:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;


import javax.swing.JOptionPane;

public class ObjectStreamHandler {
    private ObjectOutputStream outputStream;
    private ObjectInputStream ois;

    // private ArrayList<Object>energi;

    public void saveObject(ArrayList<EL> elObjectsCollector, String fileName) {
        try {
            outputStream = new ObjectOutputStream(new FileOutputStream(fileName
                    + ".dat"));

            outputStream.writeObject(elObjectsCollector);
            // outputStream.flush();
            outputStream.close();
            JOptionPane.showMessageDialog(null, "File saved", "Information",
                    JOptionPane.INFORMATION_MESSAGE);

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void loadObject(String fileName) {

        try {
            FileInputStream fis = new FileInputStream(fileName + ".dat");

            ois = new ObjectInputStream(fis);

            try {
                ArrayList<EL> energi = (ArrayList<EL>) ois.readObject();

                ois.close();

                for (EL e : energi) {
                    System.out.println(e);
                }

            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("End of file");
            try {
                ois.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    }
}
Avatar billede arne_v Ekspert
21. oktober 2012 - 14:24 #12
Kig paa min save3 metode.

:-)
Avatar billede Godfather75 Nybegynder
21. oktober 2012 - 15:38 #13
Kan du beskrive linievis hvad den gør i metode save3.? ;-)
Avatar billede arne_v Ekspert
21. oktober 2012 - 15:43 #14
Ja.
 
        // laes liste med alle eksisterende objekter
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FNM));
        ArrayList<Object> lst = (ArrayList<Object>) ois.readObject();
        ois.close();
        // tilfoej nyt objekt til liste
        lst.add(o);
        // gem liste med baade de gamle og det nye objekt
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FNM));
        oos.writeObject(lst);
        oos.close();
Avatar billede Godfather75 Nybegynder
21. oktober 2012 - 16:03 #15
Mange tak arne_v.. Kan du gøre det samme med test3? :-)
Avatar billede arne_v Ekspert
21. oktober 2012 - 16:23 #16
Ja.

      public static void test3() throws FileNotFoundException, IOException, ClassNotFoundException {
        // opret fil med tom liste
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FNM));
        oos.writeObject(new ArrayList<String>());
        oos.close();
        // gem 3 objekter
        save3("A");
        save3("BB");
        save3("CCC");
        // laes liste
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FNM));
        ArrayList<Object> lst = (ArrayList<Object>) ois.readObject();
        ois.close();
        // udskriv 3 elementer fra liste
        System.out.println(lst.get(0));
        System.out.println(lst.get(1));
        System.out.println(lst.get(2));
    }
Avatar billede Godfather75 Nybegynder
21. oktober 2012 - 17:42 #17
Mange mange tak Arne_v. Det var en sej omgang..hehe:-) send et svar så får du din points
Avatar billede arne_v Ekspert
21. oktober 2012 - 19:26 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester