Avatar billede kohaar Nybegynder
25. november 2003 - 22:44 Der er 15 kommentarer og
1 løsning

Læse binær fil

Jeg har et spørgsmål. Måske lidt dumt, men det gør det jo bare lidt nemmere at løse. Jeg har leget lidt med nogle eksempler jeg fandt på nettet, og det har selfølgelig givet lidt problemer

Jeg vil først høre om der er en mulighed for at læse filen uden "throws ioexception" i main

Jeg vil også gerne vide hvorfor x og y kun bliver skrevet ud ved den nederste system.out, og ikke den midt i while løkken?

Her er koden:

import java.io.*;
public class ReadIO
{
    public static void main(String[] args) throws IOException {

    DataInputStream in = new DataInputStream(new FileInputStream("IOprimitives_0_5_0.DAT"));

        int x = 0;
        int y = 0;
        int direction = 0;
        int r1;
        int r2;
        int r3;
        int g1;
        int g2;
        int g3;
        int b1;
        int b2;
        int b3;
        StringBuffer desc;

        try {
            while (true) {
                x = in.readInt();
                in.readChar(); 
                y = in.readInt();
                in.readChar(); 
                direction = in.readInt();
        char chr;
        desc = new StringBuffer(20);
        char lineSep = System.getProperty("line.separator").charAt(0);
        while ((chr = in.readChar()) != lineSep)
            desc.append(chr);
                System.out.println(x+ " " +y);
          }
        } catch (EOFException e) {
        }
        in.close();
        System.out.println(x + " - "+y+ " - " + direction);
    }
}
Avatar billede arne_v Ekspert
25. november 2003 - 22:54 #1
Me dhensyn til første spørgsmål, så kan du jo alternativt catche
IOException.
Avatar billede arne_v Ekspert
25. november 2003 - 22:56 #2
Hvis x og y ikke udskrives  i den indre while løkke, så var
en nærliggende hypotese jo at du enten fik en EOFEXception
eller at readChar returnerede linie skift.
Avatar billede arne_v Ekspert
25. november 2003 - 22:59 #3
Iøvrigt bruger man meget sjældent linie skift i en binær fil.
Avatar billede kohaar Nybegynder
25. november 2003 - 23:03 #4
Nr 1. Skal jeg så lave en ny try og catch, eller kan jeg bare skrive catch(EOFExecption e, IOExecption e)?

Det kan ikke være en eof, for filen fylder omkring 1kb, og i den nederste system.out, skriver den, den første linje korrekt ud. Jeg har indsat linjeskift efter hver linje. Skulle den stadig ikke printe hver linje ud?
Avatar billede kohaar Nybegynder
25. november 2003 - 23:09 #5
Har fjernet linjeskift nu, men den skriver stadig ikke noget ud der... Den skriver filen rigtigt, og den må også indeholde de rigtige data, siden jeg får den sidste system.out rigtig ud. Det er bare kun den første linje. Vil jo gerne have skrevet alle dele af filen ud.

Min tekstfil ser sådan ud(har du vist set før)
14 154 0.45 0.05 0.05
234 145 1.34 0.06 0.12
osv.

Det skriver jeg så ned i en binær fil med

          out.writeChar(' ');
            out.writeInt(y);
            out.writeChar(' ');
            out.writeInt(direction);
            out.writeChar(' ');
            out.writeInt(r1);
            out.writeChar(' ');

osv.

Indsatte til sidst et linjeskift, i håb om at jeg kunne få den til at lave en løkke, hvor den udskrev alle linjerne af filen.
Avatar billede arne_v Ekspert
25. november 2003 - 23:15 #6
Normalt bruger man heller ikke mellemrum i binære filer.

Jeg prøver lige at lave et lille eksempel.
Avatar billede kohaar Nybegynder
25. november 2003 - 23:16 #7
Du er den bedste :-)
Avatar billede arne_v Ekspert
25. november 2003 - 23:26 #8
Her er eksemplet:

import java.io.*;

public class BinFile {
    private static void store(DataOutputStream dos, int iv, double xv, String sv) throws IOException {
        dos.writeInt(iv);
        dos.writeDouble(xv);
        dos.writeByte(sv.length());
        dos.write(sv.getBytes());
    }
    private static void load(DataInputStream dis) throws IOException {
        int iv = dis.readInt();
        double xv = dis.readDouble();
        int len = dis.readUnsignedByte();
        byte[] b = new byte[len];
        dis.read(b);
        String sv = new String(b);
        System.out.println(iv + " " + xv + " " + sv);
    }
    public static void main(String[] args) throws IOException {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\\test.bin"));
        store(dos, 123, 123.456, "ABC");
        store(dos, -1, -2.5, "123");
        dos.close();
        DataInputStream dis = new DataInputStream(new FileInputStream("C:\\test.bin"));
        while(dis.available() > 0) {
            load(dis);
        }
        dis.close();
    }
}
Avatar billede arne_v Ekspert
25. november 2003 - 23:27 #9
Ingen mellemrum. Ingen linieskift. Brug af available i læsningen.
Avatar billede kohaar Nybegynder
25. november 2003 - 23:42 #10
Hvis jeg kun f.eks. vil skrive x,y ud for hver linje, kan jeg så gøre sådan:import java.io.*;

public class BinFile {
    private static void store(DataOutputStream dos, int x, int y) throws IOException {
        dos.writeInt(x);
        dos.writeInt(y);
    }
    private static void load(DataInputStream dis) throws IOException {
        int x = dis.readInt();
        int y = dis.readInt();
        System.out.println(x + " " + y);
    }
    public static void main(String[] args) throws IOException {
        DataOutputStream dos = new DataOutputStream(new FileOutputStream("C:\\test.bin"));
        store(dos, 123,23);
        store(dos, 12,245);
        dos.close();
        DataInputStream dis = new DataInputStream(new FileInputStream("C:\\test.bin"));
        while(dis.available() > 0) {
            load(dis);
        }
        dis.close();
    }
}
Avatar billede kohaar Nybegynder
25. november 2003 - 23:44 #11
Og så skriver et kordinatsæt ud hver gang while løkken kører igennem. Ligesom hvis jeg i en tekstfil havde to linjer:
123 23
12 245
og så brugte readLine til at læse dem med?
Avatar billede kohaar Nybegynder
25. november 2003 - 23:45 #12
Bare for at forstå hvorfor det virker som det gør, før jeg bruger det :-)
Avatar billede arne_v Ekspert
25. november 2003 - 23:46 #13
Jep.

store skriver det der før var en linie og load læser det der før var en linie.
Avatar billede kohaar Nybegynder
25. november 2003 - 23:47 #14
Det virker i alt fald som det skal. Så må jeg lige prøve at forstå hvorfor det gør det :-) Takker mange gange...
Avatar billede kohaar Nybegynder
25. november 2003 - 23:47 #15
Hvo... Glemte helt, at du hellere må smide et svar...
Avatar billede arne_v Ekspert
25. november 2003 - 23:50 #16
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