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

21.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, dass 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 stehen 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.6 bei 50.0 und wurde mit dem JDK 1.7 auf 51.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, dass 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 /* Listing2101.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 Listing2101
063 {
064   public static void main(String[] args)
065   {
066     ClassFileReader f;
067 
068     try {
069       f = new ClassFileReader("Listing2101");
070       f.printSignature();
071       f.printVersion();
072     } catch (IOException e) {
073       System.out.println(e.toString());
074     }
075   }
076 }
Listing2101.java
Listing 21.1: Lesen einer .class-Datei mit der Klasse RandomAccessFile

Die Ausgabe des Programms ist (mit dem Compiler aus dem JDK 6 übersetzt):

Signatur...... CAFEBABE
Version....... 50.0

 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0
 <<    <     >    >>   API  © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de