Avatar billede kkaen Nybegynder
28. oktober 2010 - 12:00 Der er 5 kommentarer og
2 løsninger

Læse en fil med LinkedList i

Jeg forsøger at gemme en LinkedList i en fil. Så vil jeg gerne læse filen, og benytte den læste LinkedList. Men ved læsningen kommer der fejl.

Dette er hvad, jeg gør:

data som skal gemmes:
String[] data = new String[6];
data[0]="bla";
....
LinkedList list= new LinkedList(l3);
list.add(data);

gemmes i fil:
PrintWriter out = new PrintWriter (new BufferedWriter (new FileWriter (file)));
out.print(list);
out.flush();
out.close();

(når jeg åbner filen i NotePad, så står der 1 linie tekst i den, eftersom jeg kun har fyldt 1 plads i arrayet)

læses fra fil:
BufferedReader in = new BufferedReader(new FileReader(file));
list=new LinkedList(l3);
her har jeg så forsøgt et utal af forskellige implementeringer. F.eks.:
list=in.readLine();
eller
list.add(in.readLine());

Den sidst nye er:
ObjectInputStream in2 = new ObjectInputStream(new FileInputStream(file));
LinkedList newFirst = (LinkedList)in2.readObject();

Men ingen af implementeringerne virker. Mange af forsøgende giver Exception: cannot convert to String from String[]. Men selvom jeg forsøger, at overholde dette krav, så virker det ikke.
Den sidst nye implementering giver denne exception:
IOException at load projekt: invalid stream header: 5B5B4C6A

Jeg har forsøgt at finde vejledning og eksempler online til konvertering af LilnkedList læst fra fil til LinkedList på runtime, men de virker som sagt ikke.

Er der nogle herinde, som kan hjælpe mig med dette problem?
Avatar billede mcb2001 Nybegynder
28. oktober 2010 - 12:59 #1
Jeg tror du har misforstået hele idéen i LinkedList og så griber du opgaven lidt forkert an.

i den linie hvor du skriver "list.ad(data)" tilføjer du ét object, af type string[]. Når du så bruger printwriter.print(list) kalder du faktisk printerwriter.print(list.toString()) - som bare er en streng representation af listen.


Jeg vil foreslå at du tilføjer data direkte i din linkedlist.
LinkedList<String> list = new LinkedList<String>();
list.add("data1");
list.add("data2");
list.add("data3");
list.add("data4");
....

Og når ud så skal gemme dine informationer kan du gøre 2 ting.
Den simple løsning er at løbe alle elementer i din liste igennem, og så gemme elementerne i hver sin linie. Når du så indlæser laver du en ny tom LinkedList og indlæser linie for linie ind i din LinkedList.

Anden mulighed er serialization, men det er noget mere teknisk. Men bestemt også smartere da den gemmer den fuldstændige status af objektet.
Avatar billede kkaen Nybegynder
28. oktober 2010 - 15:06 #2
Jeg havde også selv tanken om, at den linie, der blev udskrevet, når jeg udskrev indholdet af linkedList, blot var string-repræsentationen af adressen til variablen.

Men på den anden side (og det er vel dette, som forvirrer mig), så kan jeg godt hente data ud af listen, og så vise de data. Men det er før, jeg gemmer listen som fil.

Af de 2 muligheder til løsning, du nævner, vil jeg foretrække nummer 2, eftersom min linkedList indeholder arrays af objekter. På trods af dette, kan man godt gemme hver linie for sig i en fil, men det kræver, at man holder tungen lige i munden.
Derimod burde serialization gøre det en del lettere (og mere naturligt).
Den tekniske side af det, kan jeg nok klare. Blot forståelsen for det går op for mig :-)
Avatar billede arne_v Ekspert
28. oktober 2010 - 15:17 #3
Eksempel paa liste og serialisering fra mit lager (det er en ArrayList og ikke en LinkedList, men det goe ringen forskel):

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;

public class MultiSer {
    public static void main(String[] args) throws IOException, ClassNotFoundException, JAXBException {
        List<Data> lst = new ArrayList<Data>();
        lst.add(new Data(1, "A"));
        lst.add(new Data(2, "BB"));
        lst.add(new Data(3, "CCC"));
        // binary
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\bin.dat"));
        oos.writeObject(lst);
        oos.close();
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\bin.dat"));
        List<Data> binlst = (List<Data>)ois.readObject();
        ois.close();
        for(Data d : binlst) {
            System.out.println(d);
        }
        // old XML
        XMLEncoder xe = new XMLEncoder(new FileOutputStream("C:\\xmlencdec.xml"));
        xe.writeObject(lst);
        xe.close();
        XMLDecoder xd = new XMLDecoder(new FileInputStream("C:\\xmlencdec.xml"));
        List<Data> oldxmllst = (List<Data>)xd.readObject();
        xd.close();
        for(Data d : oldxmllst) {
            System.out.println(d);
        }
        // new XML
        JAXBContext jxbctx = JAXBContext.newInstance(Wrapper.class);
        OutputStream os = new FileOutputStream("C:\\xmljaxb.xml");
        Marshaller m = jxbctx.createMarshaller();
        m.marshal(new Wrapper(lst), os);
        os.close();
        InputStream is = new FileInputStream("C:\\xmljaxb.xml");
        Unmarshaller um = jxbctx.createUnmarshaller();
        List<Data> newxmllst = ((Wrapper)um.unmarshal(is)).getLst();
        is.close();
        for(Data d : oldxmllst) {
            System.out.println(d);
        }
    }
}

@XmlRootElement
class Wrapper {
    private List<Data> lst;
    public Wrapper() {
        this(null);
    }
    public Wrapper(List<Data> lst) {
        this.lst = lst;
    }
    public List<Data> getLst() {
        return lst;
    }
    public void setLst(List<Data> lst) {
        this.lst = lst;
    }
}
Avatar billede kkaen Nybegynder
28. oktober 2010 - 16:25 #4
Efter tor. d. 28. oktober 2010 kl. 12:59:33| #1 fandt jeg nogle interessante artikler omkring emnet - bl.a.:

http://en.allexperts.com/q/Java-1046/Saving-linked-list.htm
og
http://www.devx.com/Java/Article/9931/1954

som jeg lige skulle til at forsøge med (med ændringer naturligvis).
Men så kom Arve_V "to the rescue" og så sparede jeg da noget tid :-)

Så er det ikke mest rimeligt, hvis I deler pointene? (og kommer med "svar" begge 2 så)
Avatar billede mcb2001 Nybegynder
29. oktober 2010 - 10:31 #5
du giver bare flest til Arne, han lavede lidt mere arbejde end mig :-)
Avatar billede arne_v Ekspert
29. oktober 2010 - 15:07 #6
svar

og der er ikke saa meget arbejde i at copy paste noget kode lavet til at andet sporgesmaal for nogle aar side
Avatar billede kkaen Nybegynder
01. november 2010 - 08:46 #7
Siden ingen af jer ønsker at tage æren for løsningen, så uddeler jeg pointene ud fra arbejde med forsøg på at finde løsning. Altså deler i :-)
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