Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 20 - Random-Access-I/O

## 20.3 Lesezugriffe

- 20.3 Lesezugriffe

Für die lesenden Zugriffe auf eine Random-Access-Datei stehen die folgenden Methoden zur Verfügung:

    public final boolean readBoolean()
    public final byte readByte()
    public final char readChar()
    public final double readDouble()
    public final float readFloat()
    public final int readInt()
    public final long readLong()
    public final short readShort()
    public final String readUTF()
    public final void readFully(byte[] b)
    public final void readFully(byte[] b, int off, int len)
    public final String readLine()
    public final int readUnsignedByte()
    public final int readUnsignedShort()
| java.io.RandomAccessFile

Sie lesen jeweils ein Element des angegebenen Typs und erwarten, daß es in der Datei in dem durch die korrespondierende `write`...-Methode vorgegebenen binären Format vorliegt. `readFully` kann dazu verwendet werden, beliebig viele Datenbytes ungeachtet ihres Datentyps einzulesen. `readLine` liest eine ganze Zeile Text aus und gibt sie als `String` an den Aufrufer zurück.

Darüber hinaus steht auch eine Reihe von `read`-Methoden zur Verfügung, die zum Einlesen eines einzelnen Bytes oder einer Menge von Bytes verwendet werden können:

    public int read()
    public int read(byte[] b)
    public int read(byte[] b, int off, int len)
| java.io.RandomAccessFile

Das folgende Listing zeigt die Verwendung der Klasse `RandomAccessFile` am Beispiel eines Programms, das die Signatur und Versionsnummer aus einem .class-File herausliest. Die Signatur einer Klassendatei ergibt das Wort »CAFEBABE«, wenn man die hexadezimale Darstellung der ersten vier Bytes ausgibt. In den nächsten beiden Bytes folgt die Minor-Versionsnummer und in den darauffolgenden zwei Bytes die Major-Versionsnummer. Die Versionsnummer liegt bis zum JDK 1.3 bei 45.3 und wurde mit dem JDK 1.4 auf 46.0 geändert.

Das Programm implementiert eine Klasse `ClassFileReader`, die den Zugriff auf die Klassendatei ermöglicht. Der Konstruktor öffnet die Datei, und die Ausgabe der Signatur und Versionsinformation erfolgt mit Hilfe der Methoden `printSignature` und `printVersion`.

Das Einlesen der Signatur erfolgt durch Lesen der ersten 4 Byte der Datei, die dann jeweils in High- und Lowbyte zerlegt und in ihre hexadezimale Darstellung umgewandelt werden. Bei der Verwendung der Methode `read` zum Einlesen der Bytes ist zu beachten, daß der Rückgabewert vom Typ `int` ist. Er darf auch nicht in ein `byte` konvertiert werden, weil es sonst einen Vorzeichenüberlauf geben würde. Das Einlesen der Versionsnummern erfolgt mit der Methode `readShort`, die einen vorzeichenlosen 16-Bit-Wert aus der Datei liest. Auch hier ist der Rückgabewert vom Typ `int`, um den gesamten Wertebereich von 0 bis 65535 darstellen zu können.

    001 /* Listing2001.java */
    002
    003 import java.io.*;
    004
    005 class ClassFileReader
    006 {
    007   private RandomAccessFile f;
    008
    009   public ClassFileReader(String name)
    010   throws IOException
    011   {
    012     if (!name.endsWith(".class")) {
    013       name += ".class";
    014     }
    015     f = new RandomAccessFile(name,"r");
    016   }
    017
    018   public void close()
    019   {
    020     if (f != null) {
    021       try {
    022         f.close();
    023       } catch (IOException e) {
    024         //nichts
    025       }
    026     }
    027   }
    028
    029   public void printSignature()
    030   throws IOException
    031   {
    032     String ret = "";
    033     int b;
    034
    035     f.seek(0);
    036     for (int i=0; i<4; ++i) {
    037       b = f.read();
    038       ret += (char)(b/16+'A'-10);
    039       ret += (char)(b%16+'A'-10);
    040     }
    041     System.out.println(
    042       "Signatur...... "+
    043       ret
    044     );
    045   }
    046
    047   public void printVersion()
    048   throws IOException
    049   {
    050     int minor, major;
    051
    052     f.seek(4);
    053     minor = f.readShort();
    054     major = f.readShort();
    055     System.out.println(
    056       "Version....... "+
    057       major+"."+minor
    058     );
    059   }
    060 }
    061
    062 public class Listing2001
    063 {
    064   public static void main(String[] args)
    065   {
    066     ClassFileReader f;
    067
    068     try {
    069       f = new ClassFileReader("Listing2001");
    070       f.printSignature();
    071       f.printVersion();
    072     } catch (IOException e) {
    073       System.out.println(e.toString());
    074     }
    075   }
    076 }
| Listing2001.java

Listing 20.1: Lesen einer .class-Datei mit der Klasse RandomAccessFile

Die Ausgabe des Programms ist:

    Signatur...... CAFEBABE
    Version....... 45.3

Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de