From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- .../hjp5/html/k100133.html | 260 +++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 Master/Reference Architectures and Patterns/hjp5/html/k100133.html (limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100133.html') diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100133.html b/Master/Reference Architectures and Patterns/hjp5/html/k100133.html new file mode 100644 index 0000000..0ecb1a5 --- /dev/null +++ b/Master/Reference Architectures and Patterns/hjp5/html/k100133.html @@ -0,0 +1,260 @@ + + + +Handbuch der Java-Programmierung, 5. Auflage + + + + + + + + + +
 Titel  + Inhalt  + Suchen  + Index  + DOC  +Handbuch der Java-Programmierung, 5. Auflage +
 <<  +  <   +  >   + >>  + API  +Kapitel 20 - Random-Access-I/O +
+
+ + + + +

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, 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 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, 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 /* 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, 5. Auflage, Addison +Wesley, Version 5.0.1 +
 <<  +  <   +  >   + >>  + API  +© 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de +
+ + + -- cgit v1.2.3