Oprettet fre. d. 19. oktober 2012 kl. 11:00:59

Godfather75
Godfather75 (1.775 point. Point ude: 180)

Vedr. Objectinputstream

Hvordan læser man en fil med mange objekter med objectinputstream?

Skrevet fre. d. 19. oktober 2012 kl. 11:04:11| #1

arne_v
arne_v (1.048.763 point)
Kalder readObject flere gange.

:-)

Proev og forklarf hvad problemet er.

Skrevet fre. d. 19. oktober 2012 kl. 14:59:12| #2

Godfather75
Godfather75 (1.775 point)
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);
       
    }
       
    }
   
}

Skrevet lør. d. 20. oktober 2012 kl. 17:25:47| #3

arne_v
arne_v (1.048.763 point)
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.

Skrevet lør. d. 20. oktober 2012 kl. 17:26:34| #4

arne_v
arne_v (1.048.763 point)
Proev evt. at gemme en ArrayList med alle dine objekter fremfor de enkelte objekter.

Skrevet lør. d. 20. oktober 2012 kl. 22:52:56| #5

arne_v
arne_v (1.048.763 point)
Hm.

Open, skriv og luk virker faktisk.

Skrevet lør. d. 20. oktober 2012 kl. 22:53:08| #6

arne_v
arne_v (1.048.763 point)
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();
    }
}

Skrevet lør. d. 20. oktober 2012 kl. 22:53:24| #7

Godfather75
Godfather75 (1.775 point)
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?

Skrevet lør. d. 20. oktober 2012 kl. 22:53:56| #8

arne_v
arne_v (1.048.763 point)
men:

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

virker vist ikke.

Jeg fik ihvertfald en exception ved EOF.

Skrevet søn. d. 21. oktober 2012 kl. 00:25:52| #9

Godfather75
Godfather75 (1.775 point)
Test 3 kan du simpel gøre den lidt mere? Hvorfor laver du en  oos.writeObject(new ArrayList<String>());?

Skrevet søn. d. 21. oktober 2012 kl. 09:27:23| #10

arne_v
arne_v (1.048.763 point)
while(true){
                    try {
                     
                     
                        energi.add(ois.readObject());
                        ois.reset();     
                    } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

ligner en uendelig loekke.

Skrevet søn. d. 21. oktober 2012 kl. 11:18:45| #11

Godfather75
Godfather75 (1.775 point)
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();
            }
        }
    }
}

Skrevet søn. d. 21. oktober 2012 kl. 14:24:29| #12

arne_v
arne_v (1.048.763 point)
Kig paa min save3 metode.

:-)

Skrevet søn. d. 21. oktober 2012 kl. 15:38:14| #13

Godfather75
Godfather75 (1.775 point)
Kan du beskrive linievis hvad den gør i metode save3.? ;-)

Skrevet søn. d. 21. oktober 2012 kl. 15:43:55| #14

arne_v
arne_v (1.048.763 point)
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();

Skrevet søn. d. 21. oktober 2012 kl. 16:03:40| #15

Godfather75
Godfather75 (1.775 point)
Mange tak arne_v.. Kan du gøre det samme med test3? :-)

Skrevet søn. d. 21. oktober 2012 kl. 16:23:32| #16

arne_v
arne_v (1.048.763 point)
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));
    }

Skrevet søn. d. 21. oktober 2012 kl. 17:42:16| #17

Godfather75
Godfather75 (1.775 point)
Mange mange tak Arne_v. Det var en sej omgang..hehe:-) send et svar så får du din points

Skrevet søn. d. 21. oktober 2012 kl. 19:26:08| #18


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Fortolkning af Java Interface

Oprettet den 20. maj 2013 kl. 18.58
m_ali giver 30 point for svar | Giv et svar »

Privatundervisning i JAVA søges

Oprettet den 18. maj 2013 kl. 22.56
Bilalj (nedlagt brugerprofil) giver 30 point for svar | Giv et svar »

Bedste bog for en begynder?

Oprettet den 9. maj 2013 kl. 16.07
DBigShooter giver 30 point for svar | Giv et svar »








Tips & Tricks fra PC World

Teaser billede

Her er seks Google Labs-funktioner, som du skal slå til med det samme

Gmail Labs giver dig adgang til en masse smarte funktioner, som Googles ingeniører leger med i øjeblikket.


Anmeldelser fra PC World

Teaser billede

Test: Samsung Galaxy S4 er et hit - trods gøglertricks

Kan Samsung beholde førertrøjen i det store Android-race? Galaxy S4 er smækfyldt med innovative funktioner, men også med en del gøgl. Er det for meget? Få vores dom over Samsungs nye topmodel.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Tre smarte trick som gør Windows 8 bedre

Boot direkte til skrivebordet, få en strategisk godt placeret luk-knap og slip for at logge ind. Her er tre tips til Windows 8, som gør det nemmere at blive venner med styresystemet.


Nyheder fra Computerworld

Teaser billede

Galleri: Her er Googles nyeste værktøj og legetøj

Google har i denne uge afholdt udviklerkonferencen I/O i San Francisco. Se her hvad søgegiganten kunne præsentere af nyskabelser.


IT Kurser
Samarbejdspartnere

Udgiver · © 2013 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger