tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
1277
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    Hallo Leute,
    beschäftige mich erst seit kurzem mit Java und habe nun folgendes Problem!

    folgendes mache ich in C++.
    Code :
    1
    
    file.Read(&Struktur, sizeof(Struktur));
    Und mit dieser einfachen Zeile habe ich mein komplette Struktur, bestehend aus mehreren int´s und char Arrays gelesen.

    Das versuche ich nun auch in Java. Erstes Problem: Es gibt keine Strukturen! OK, man nehme eine Klasse und definiert dort alle Variablen. Nun kann ich aber nicht
    sizeof() machen zumal es das ja in Java nicht gibt.

    Ich habe nun folgendes:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    JFileChooser fc = new JFileChooser();
    fc.showOpenDialog(MyApp.this);
    File file = fc.getSelectedFile();
    try 
    {
      FileInputStream in = new FileInputStream(file);
      MyStrukturClass struktur = new MyStrukturClass();
                      
      byte[] buf = new byte[4096];
      int len;
      while ((len = in.read(buf)) > 0) 
      {
        // hier was Struktur beschreiben
      }
      in.close();
    }
    catch (IOException ec) 
    {
      System.err.println(ec.toString());
    }

    Wie bekomme ich jetzt am komfortabelsten meine Variablen der Strukturklasse beschrieben. Ich muss doch nicht etwa jedesmal, je nach Datentyp eine bestimmte Anzahl an Bytes lesen

    Vielleicht kann mir ja jemand von Euch einen Tipp geben (vielleicht mit Beispiel). Nehmen wir an ich will eine Struktur{int alter, char Info[30], usw.} auslesen.
    mfg
     

  2. #2
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    In Java muss man sich um solche Dinge (im Normalfall) nicht mehr kümmern, dafür gibts Serialisierung:

    Beispiel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    package de.tutorials;
     
    import java.io.Serializable;
     
    class Struct implements Serializable {
        public int x;
     
        public int y;
     
        public char c;
     
        public boolean b = false;
    }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
     
    package de.tutorials;
     
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
     
    public class Test06 {
     
        public static void main(String[] args) {
            new Test06().doIt();
        }
     
        private void doIt() {
            Struct s = new Struct();
            s.b = true;
            s.x = 2313;
            s.y = 34231414;
            s.c = 'A';
            
            try {
                ObjectOutputStream oos = new ObjectOutputStream(
                        new FileOutputStream("c:/out.ser"));
                oos.writeObject(s);
                oos.flush();
                oos.close();
     
                Struct s0 = null;
     
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                        "c:/out.ser"));
     
                s0 = (Struct) ois.readObject();
                System.out.println(s0.b);
                System.out.println(s0.x);
                System.out.println(s0.y);
                System.out.println(s0.c);
     
                ois.close();
     
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
     
        }
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  3. #3
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    Hi Tom,

    man ist ja gar nicht mal so schlecht dieses Java, Steige gerade von C++ in die Java Programmiertechnik ein und habe mir den Umstieg leichter vorgestellt.

    Auf jeden Fall danke nochmal, denn das macht die Sache doch wesentlich einfacher.

    Gruß Christian
     

  4. #4
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    Hallo Tom,

    ich glaube ich habe mich zu früh gefreut! Kann es sein, dass ich nur so lesen kann, wenn ich es auch mittels eines Streams geschrieben habe? Denn ich habe die Datei, fertig dazuliegen (wird von einem anderen System geliefert) und schreibe daher nicht mit
    Code :
    1
    2
    3
    4
    5
    
    ObjectOutputStream oos = new ObjectOutputStream(
      new FileOutputStream("c:/out.ser"));
      oos.writeObject(s);
      oos.flush();
      oos.close();
    Denn nun bekomme ich nämlich beim lesen aus der vorhandenen Datei eine Exception "invalid stream header". Kannst du dir das erklären und hättest du einen anderen Vorschlag?

    Hier mein Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    if (e.getActionCommand() == "File open")
                {
                    JFileChooser fc = new JFileChooser();
                    fc.showOpenDialog(MyApp.this);
                    File file = fc.getSelectedFile();
                    try 
                    {
                        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
                        init = (InitStruct) ois.readObject();
                        
                        System.out.println("Info: "+ init.lpszInfo.toString());
                        System.out.println("Flags: "+init.flags);
                        System.out.println("AppType: "+init.nAppTyp);
                        System.out.println("ProtoType: "+init.nPrototyp);
                        System.out.println("Size: "+init.nSize);
                        System.out.println("Version: "+init.nVersion);
                        
                        ois.close();
                    
                    } 
                    catch (FileNotFoundException event) 
                    {
                        event.printStackTrace();
                } 
                    catch (IOException event) 
                    {
                        event.printStackTrace();
                } 
                    catch (ClassNotFoundException event) 
                    {
                        event.printStackTrace();
                }
                
                }
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    class InitStruct implements Serializable
    {
        public long     nSize;
        public int  nVersion;
        public int  nPrototyp;
        public int  nAppTyp;
        public char     lpszInfo[];
        public long     flags;
    }
    Gruß Christian
     

  5. #5
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von sisela
    Hi Tom,
    man ist ja gar nicht mal so schlecht dieses Java, Steige gerade von C++ in die Java Programmiertechnik ein und habe mir den Umstieg leichter vorgestellt.

    Gruß Christian
    Java ist wesentlich einfacher als C++. Ich habe erst Java gelernt und wenn ich mich nun mit C++ beschäftigen muss, kriege ich die Krise, wie kompliziert und umständlich alles in der C++ Welt ist. Von der API ganz zu schweigen...
    3 Tips:
    1. Schau in die Sun Tutorials
    2. Schau in die API
    3. Verschiedene Bücher zum Nachschlagen gibt es auch als Online-Versionen, z.B. die Java-Insel oder Handbuch der Java-Programmierung

    Zu Deiner Datei: Nimm mal einen BufferedReader und/oder 1-3.
     

  6. #6
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    Hi @snape!

    Danke erst einmal. Sag mal gibt es in Java denn nichts wie sizeof()? Denn wenn ich den BufferedReader nehme, muss ich ja immer angeben wieviele Bytes ich lesen will. Wenn sich nun aber meine Datenstruktur ändert, möchte ich ja nicht die tausend stellen im Programm ändern. In C gibt es sowas wie sizeof(variable) und dann würde ich bei einem WORD variable halt ein WORD lesen und bei DWORD variable ein DWORD.
    Ich hoffe du verstehst was ich meine, ich will halt nicht sowas wie
    Code :
    1
    
    raFile.read(byte[]b, raFile.getFilePointer(), 8);
    Die 8 muss halt irgendwie weg

    mfg
     

  7. #7
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Du musst die Größe nicht wissen. Schau mal z.B. hier:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
        public static void main(String[] args)
        {
            try
            {
                FileReader fr = new FileReader("C:/boot.ini");
                BufferedReader br = new BufferedReader(fr);
                String line = null;
                Vector vector = new Vector();
     
                //So lange Zeilen aus der Datei einlesen bis
                //End Of File (EOF) --> br.readLine() => null 
                //gelesene Zeilen in den Vector schieben
                [B]while ((line = br.readLine()) != null)[/B]
                {
                    vector.add(line);
                }
     
                //Anzahl der Elemente im Vector
                int size = vector.size();
                //Zeilen ausgeben
                for (int i = 0; i < size; i++)
                {
                    System.out.println(vector.get(i));
                }
     
            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
     

  8. #8
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    Sicherlich wäre es möglich die ganze Datei einzulesen aber genau das will ich nicht, denn die ist riesig. In meiner Datei stehen lauter Strukturen (leider kein Java Stream). Also sagen wir mal meine erste Variable der Struktur ist ein Integer. Nun möchte ich nur diese Variable also sizeof(int) gerne auslesen, was genau 4Bytes entsprechen müsste. Also es bringt mir nichts die komplette Datei einzulesen, noch mit Streams aus der Datei heraus lesen, weil die Daten nicht mittels Java Streams reingeschrieben werden.

    Wie gesagt in C ist das eine Zeile:
    Code :
    1
    
    file.Read(&var, sizeof(var));

    Im Moment versuche ich mich an der RandomAccessFile und lese halt immer genau die Größe eines bestimmten Datentyps.
    Code :
    1
    
    init.nVersion = raFile.readShort();

    Aber der Code wird dann so lang, das muss doch einfacher gehen, da ich ja jeden einzelnen Datentyp extra einlesen muss.

    mfg
     

  9. #9
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Die Serialisierung in Java macht noch ein wneig mehr als nur die Werte der jeweiligen Membervariablen (die sich Externalisieren lassen) ein einen Stream und dann auf die Platte zu hauen. Zusätzlich werden nämlich noch einige Verwaltungsinformationen zu der Klasse und den darin enthaltenen Daten abgelegt. Wie etwa Klassenname, Variablentyp etc. Deshalb kannst du mit dem Serialisierungsmechanismus nur schwer Daten die aus anderen nicht Java Anwendungen heraus erstellt wurden lesen (Du müsstest eben diese zusätzlichen Verwaltungsinformationen noch hinzufügen und so gestallten, dass Java was damit anfangen kann, was eigentlich so gut wie unmöglich ...oder sagen wir mal schwer möglich ist.)

    Btw. lerne ich auch gerade C++ und muss sagen, dass mir meine Java Erfahrung dort extrem Hilft. Java hat nun mal sehr viele Konzepte von C++ übernommen /bzw. ähnlich realisiert was einem den Einstieg IMHO recht einfach macht.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  10. #10
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von Thomas Darimont
    Hallo!
    Btw. lerne ich auch gerade C++ und muss sagen, dass mir meine Java Erfahrung dort extrem Hilft. Java hat nun mal sehr viele Konzepte von C++ übernommen /bzw. ähnlich realisiert was einem den Einstieg IMHO recht einfach macht.
    Gruß Tom
    Dann bin ich entweder zu alt, zu doof oder mir fehlt einfach ein (guter) Tutor. Der ganze Krempel mit * und & will einfach nicht in meinen Kopf, wann und warum die zu benutzen sind.
    Dazu geben mir die schlechte API und die kryptische Syntax den Rest.
     

  11. #11
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    @Thomas
    Ja, das mit den Zusatzinformationen habe ich schon mitbekommen, als ich mir die Datei dann mal angeschaut habe. Sprich Serialisierung kommt für mich nicht in Frage.
    @snape
    Also deine lieblige * und & sind wenn man sie erst einmal schätzen gelernt hat, sehr nette Wegbegleiter und machen so manches möglich .

    PS
    - und zu doof bist du bestimmt nicht...
    - und API und Syntax sind gewöhnungsbedürftig (ich gebe es zu) aber es ist nicht unmöglich sie zu verstehen...

    mfg
     

  12. #12
    Registriert seit
    Apr 2004
    Ort
    Ruhrgebiet
    Beiträge
    1.582
    Zitat Zitat von sisela
    @snape
    Also deine lieblige * und & sind wenn man sie erst einmal schätzen gelernt hat, sehr nette Wegbegleiter und machen so manches möglich .
    Ja, ich habe ja schon mitbekommen, dass man damit ab und an nette Sachen machen kann. Aber wie gesagt, das ist mir noch nicht in Fleisch und Blut übergegangen. Und fehlerträchtig sind sie wohl auch, es heißt rund 70% der C++ Fehler sind Zeiger/Pointer-Fehler...

    PS
    - und zu doof bist du bestimmt nicht...
    Zumindest für C++ habe ich den Eindruck...

    - und API und Syntax sind gewöhnungsbedürftig (ich gebe es zu) aber es ist nicht unmöglich sie zu verstehen...

    mfg
    Unmöglich vielleicht nicht, aber vergiss nicht, ich bin Java ge- und verwöhnt.
     

  13. #13
    Avatar von sisela
    sisela sisela ist offline Mitglied Brokat
    Registriert seit
    Jan 2004
    Ort
    Berlin
    Beiträge
    360
    @snape:
    mit 70% magst du recht haben...
     

  14. #14
    torsch2711 torsch2711 ist offline Mitglied Brokat
    Registriert seit
    Oct 2004
    Ort
    Hessen
    Beiträge
    310
    Lol Snape,

    da fang erst gar nicht mit C an, das wird noch komplexer

    War n scherz, ist aber richtig, hab in meinem Studium zwischendurch mal C gecodet und danach nur noch Java. Jetzt bin ich wieder in ein C Projekt involviert und muss sagen, dass ich dort in das ein oder andere Fettnäpfchen trete....

    Naja, dem C++ Coder hier geht es genauso mit C. Ist halt dort alles umständlicher.

    Egal.

    Viel Spass noch mit Java, ist ein sehr gutes Konzept meiner Meinung nach.

    Grüsse

    Torsten
     
    "There's nothing we have to fear, except Fear itself....."

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 23.09.10, 11:26
  2. Antworten: 13
    Letzter Beitrag: 10.04.08, 08:37
  3. Fehlerhafte Datei Struktur :(
    Von S3RI0US im Forum Cinema 4D
    Antworten: 4
    Letzter Beitrag: 13.10.05, 00:04
  4. Struktur in Datei speichern
    Von yan1 im Forum .NET Archiv
    Antworten: 12
    Letzter Beitrag: 14.04.05, 10:10
  5. Antworten: 7
    Letzter Beitrag: 11.05.02, 15:40