| Titel | Inhalt | Suchen | Index | API | Go To Java 2, Zweite Auflage, Handbuch der Java-Programmierung |
| << | < | > | >> | Kapitel 20 - Random-Access-I/O | |
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.
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)(%b16+'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 |
Die Ausgabe des Programms ist:
Signatur...... CAFEBABE
Version....... 45.3
| Titel | Inhalt | Suchen | Index | API | Go To Java 2, Zweite Auflage, Addison Wesley, Version 2.0 |
| << | < | > | >> | © 2000 Guido Krüger, http://www.gkrueger.com | |