Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
<< | < | > | >> | API | Kapitel 21 - 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, 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 |
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 |