Avatar billede onkel_satan Nybegynder
17. januar 2005 - 20:38 Der er 17 kommentarer og
1 løsning

Læs alle objekter i filen.

Læser nogle objekter fra en fil og gemmer dem i en ArrayList på den her maade:

ArrayList orders = new ArrayList();
FileInputStream in = new FileInputStream("orders.dat");
ObjectInputStream p = new ObjectInputStream(in);
orders.add((Order)p.readObject());
in.close();

Men hvordan for jeg den til at fortsaette med at indlæse all objekterne i filen og ikke kun det første.
Kunne se at reaObject returnere et object eller -1 hvir der ikke er noget. Men hvordan fanden tester man på og den returnere -1.
Har forsøg på mange maader men uden held :(
Håber i kan hjaelpe.
På forhaand tak.
Avatar billede arne_v Ekspert
17. januar 2005 - 20:42 #1
readObject returnerer ikke -1 hvis der ikke er noget - den smider en exception.

Prøv:

ArrayList orders = new ArrayList();
FileInputStream in = new FileInputStream("orders.dat");
ObjectInputStream p = new ObjectInputStream(in);
while(p.available() > 0) {
    orders.add((Order)p.readObject());
}
in.close();
Avatar billede arne_v Ekspert
17. januar 2005 - 20:43 #2
PS: Er du klar over at du kan skrive og læse en hel ArrayList med indhold med
et enkelt kald til ObjectOutputStream writeObject og ObjectInputStream readObject ?
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 20:54 #3
hmm det virker ikke som om det virker.
Får denne her:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size:0
        at java.util.ArrayList.RangeCheck(ArrayList.java:507)
        at java.util.ArrayList.get(ArrayList.java:324)
        at PizzAdmin.main(PizzAdmin.java:32)
Press any key to continue...

PizzAdmin linie 32 er:
System.out.println(((Order)orders.get(0)).view_invoice());

Uden while løkken kan jeg sagtens udskrive den første (index nr. 0), men ikke med while løkken.
Avatar billede arne_v Ekspert
17. januar 2005 - 20:59 #4
Hm. Prøv lige at undersøg:
  - hvor mange bytes er der i filen ?
  - hvad returnerer p.available() ?
  - kommer du ind i while løkken ?
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 21:01 #5
"PS: Er du klar over at du kan skrive og læse en hel ArrayList med indhold med
et enkelt kald til ObjectOutputStream writeObject og ObjectInputStream readObject ? "
Jo jeg prøvede oxo på det, men jeg har desvaerre lavet nogle af tingende lidt bøvlet så det ikke rigtig kom til at virke. Men kan godt vaere at jeg alligevel skoder det gamle og laver det om så jeg kan gemme hele arraylisten.
Problemet lå i at vi fra starten havde lagt save metoden inde i det objektet selv.
Dvs. at objektet skal gemme sig selv. f.eks.
Order o = new Order(blablabla, blabla, bla);
o.save(o);
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 21:08 #6
hmm
System.out.println(p.available());
siger 0.
Men det kan ikke rigtig passe for den kan jo godt skrive den første ud.
Filen fylder 2.41kb og vokser hver gange jeg køre min save function.
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 21:12 #7
saa nej den kommer ikke ind i løkken.
Avatar billede arne_v Ekspert
17. januar 2005 - 21:28 #8
Jeg kan heller ikke få .available() > 0 til at virke, du bliver nok nødt til at catche EOFException
Avatar billede arne_v Ekspert
17. januar 2005 - 21:32 #9
import java.io.*;
import java.util.*;

public class OOS {
    public static void main(String[] args) throws Exception {
        ArrayList lst1 = new ArrayList();
        lst1.add("a");
        lst1.add("bb");
        lst1.add("ccc");
        System.out.println(lst1);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\ser.dat"));
        for(int i = 0; i < lst1.size(); i++) {
            oos.writeObject(lst1.get(i));
        }
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\ser.dat"));
        ArrayList lst2 = new ArrayList();
//        while(ois.available() > 0) {
//            lst2.add(ois.readObject());
//        }
        try {
            while(true) {
                lst2.add(ois.readObject());
            }
        } catch(EOFException e) {
            // OK
        }
        ois.close();
        System.out.println(lst2);
    }
}
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 21:33 #10
ja jeg søgte oxo lidt på .available() og fandt hurtigt ud af at jeg(din løsning) ikke er dem eneste der har haft problemer med den.
Mne ok så dropper vi den løsning. Måske spørger jeg dumt nu, men hvordan fanger jeg EOF Exception ?
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 21:35 #11
k prøver lige =)
Avatar billede arne_v Ekspert
17. januar 2005 - 21:35 #12
se ovenfor
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 23:14 #13
Har prøvet din kode og den ser da ud til at virke, men min faar jeg sgu fejl ved.
Faar en java.io.StreamCorruptedException hvorefter den skriverdet første element ud.
Derefter slutter den af med en exception fra ArrayListen :
exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size:0
        at java.util.ArrayList.RangeCheck(ArrayList.java:507)
        at java.util.ArrayList.get(ArrayList.java:324)
        at PizzAdmin.main(PizzAdmin.java:32)
Avatar billede arne_v Ekspert
17. januar 2005 - 23:33 #14
StreamCorruptedException antyder at indholdet af din fil og dine klasser ikke
matcher.

Har du ændret i nogle af klasserne efter at du har skrevet til fil ?
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 23:45 #15
Nej jeg har ikke rigtig andret på klasserne. Det maerkelige er jo oxo at det første element fungere fint men gaar galt med resten.
Mne pga. jeg ikke er saa lagt fra deadline (skole opgave, kunne man jo taenke sig til) har jeg valg at bruge et af dine tidligere forslag og bare smale objekterne i en arraylist og saa skriv den til filen. Man kan saa diskutere hvorvidt det er smart eller ej (hvis man forstiller sig at der er mange objekter i arraylisten) da man så i princippet skal skrive hele arraylisten til filen hver gang man vil tilføje en order.
Men mange tak for din hjælp, om ikke andet saa er jeg da blevet lidt klogere på java og dens metoder til at skrive/læse fra filer.
ohhh ja.. smid et svar så du kan få mine velfortjænte point :D
Avatar billede arne_v Ekspert
17. januar 2005 - 23:47 #16
kommer her
Avatar billede onkel_satan Nybegynder
17. januar 2005 - 23:47 #17
damn.. er sgu ved at vaere for traet... mener self. DINE velfortjente point hehe.
Avatar billede arne_v Ekspert
17. januar 2005 - 23:48 #18
Det havde jeg gættet !

:-)
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