Daten einlesen (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
K
Zeile 100: Zeile 100:
 
</code=java>
 
</code=java>
  
[[Kategorie:Tutorials (Java)]]
 
 
[[Kategorie:Java]]
 
[[Kategorie:Java]]
 +
[[Kategorie:Tutorials (Java)]]

Version vom 26. Juli 2008, 06:13 Uhr

Um mit Java Daten einzulesen hat man mehrere Möglichkeiten von Bytestreams und Characterstreams. Bytestreams eignen sich für alle Arten von Daten da alles als Binärdaten vorliegt, Characterstreams eignen sich besonders zum Einlesen und Schreiben von Zeichenketten im ASCII oder anderen Formaten.

Klasse die für das Einlesen von Daten zuständig sind haben immer ein Input, bei Binärstreams oder Reader, bei Charachterstreams im Namen.

Binär Streams

Um Binärdaten einzulesen können alle Streams verwendet werden die vom InputStream abgeleitet sind, so z.B. der FileInputStream oder auch der BufferedInputStream. Der FileInputStream ist der einzigste Bytestream der direkt auf Dateien zugreifen kann., daher wird er verwendet wenn man Daten aus eine Datei einlesen will. <code=java> FileInputStream fin = new FileInputStream("datei"); </code=java> Hat man keine Datei sondern bekommt einen Stream, z.B. von einem Socket kann man für diese ein InputStream Objekt deklarieren. <code=java> InputStream in = socket.getInputStream(); </code=java> Wenn man den Stream hat kann man dann die Daten aus dem Stream mit den verschiedenen read Methoden laden, jedoch kapselt man die einfachen Streams oftmals noch in einem gepufferten Stream, BufferedInputStream um so die Lesezugriffe auf das Medium zu minimieren. <code=java> BufferedInputStream bufin = new BufferedInputStream(in); </code=java> Nach dem Öffnen des Streams fängt man immer am 1. Byte des Streams an, man kann sich das wie ein Zeiger vorstellen der nach jedem Lesevorgang um die gelesenen Bytes vorbewegt. Die einfache read Methode ohne Parameter liest immer nur ein Byte und gibt dieses zurück. Desweiteren gibt es eine read Methode die ein byte Array als Argument bekommt, dieser Array muss vorher angelegt werden und wird dann komplett mit Daten gefüllt und die Anzahl der gelesenen bytes wird als int Wert zurückgegeben. So erfährt man ob der Array komplett voll ist oder ob er nur teilweise gefüllt wurde. Als dritte Methode gibt es die Methode mit drei Parametern einem byte Array und zwei int Werten, der byte Array wird wie bei der anderen Methode mit Werten gefüllt und die beiden int Werte beschreiben den Offset(Anzahl der Bytes die nicht gelesen werden) und die maximale Anzahl an Bytes die gelesen werden. Wie auch bei der andern Methode wird die tatsächliche Anzahl an gelesenen Elementen zurückgegeben. Alle drei Methoden haben gemeinsam das wenn sie am Ende des Streams angelangt sind -1 zurückgeben. Einlesen einer ganzen Datei: 1. nur ein Byte einlesen <code=java> int length; while((length=bufin.read())!=-1) {

 System.out.println(length);

} </code=java> 2. immer 250 Byte einlesen <code=java> int length; byte[] buffer = new byte[250]; while((length=bufin.read(buffer))!=-1) {

 for(int i=0;i!=length;i++)
   System.out.print(buffer[i]);
 System.out.println();

} </code=java> 3. nur ab dem 250.Byte 4 Byte einlesen <code=java> int length; byte[] buffer = new byte[250]; length=bufin.read(buffer,250,4); for(int i=0;i!=length;i++)

 System.out.print(buffer[i]);

</code=java>

Character Streams

Um Zeichenketten einzulesen nimmt man meistens Klassen die von Reader abgeleitet sind, so z.B. FileReader oder BufferedReader. Diese Klassen bieten meistens auch die Möglichkeit die Daten in einen bestimmten Zeichensatz zu konvertieren. Wie bei den Binärstreams gibt es auch hier nur einen Stream der nur direkt auf Dateien geht, der FileReader. <code=java> FileReader fin = new FileReader("Datei"); </code=java> Hat man jedoch nur einen normalen Bytestream will aber einen Reader verwenden muss man den vorher Kapseln, dies kann man mit dem InputStreamReader machen. <code=java> InputStreamReader in = new InputStreamReader(socket.getInputStream()); </code=java> Wenn man den Reader hat kann man dann die Zeichen aus dem Stream mit den verschiedenen read Methoden laden, jedoch kapselt man die einfachen Streams oftmals noch in einem gepufferten Stream BufferedReader um so die Lesezugriffe auf das Medium zu minimieren und auch kompfortabler zu lesen. Denn der BufferedReader besitzt eine readLine Methode welche eine komplette Zeile einliest die man dann verarbeiten kann. <code=java> BufferedReader read = new BufferedReader(in); </code=java> Nach dem Öffnen des Readers fängt man immer am 1.Zeichen des Streams an, man kann sich das wie ein Zeiger vorstellen der nach jedem Lesevorgang um die gelesenen Zeichen vorbewegt. Die einfache read Methode ohne Parameter liest immer nur ein Zeichen und gibt dieses zurück. Desweiteren gibt es eine read Methode die ein char Array als Argument bekommt, dieser Array muss vorher angelegt werden und wird dann komplett mit Zeichen gefüllt und die Anzahl der gelesenen Zeichen wird als int Wert zurückgegeben. So erfährt man ob der Array komplett voll ist oder ob er nur teilweise gefüllt wurde. Als dritte Methode gibt es die Methode mit drei Parametern einem char Array und zwei int Werten, der char Array wird wie bei der anderen Methode mit Werten gefüllt und die beiden int Werte beschreiben den Offset(Anzahl der Zeichen die nicht gelesen werden) und die maximale Anzahl an Zeichen die gelesen werden. Wie auch bei der andern Methode wird die tatsächliche Anzahl an gelesenen Elementen zurückgegeben. Alle drei Methoden haben gemeinsam das wenn sie am Ende des Streams angelangt sind -1 zurückgeben. Die letzte Methode ist die readLine Methode des BufferedReader diese liest immer eine ganze Zeile ein bis zum \n oder \r oder \r\n und gibt den String ohne den Zeilenumbruch zurück. Ist sie am Ende der Datei angelangt gibt sie null zurück. Einlesen einer ganzen Datei: 1. nur ein Zeichen einlesen <code=java> int length; while((length=read.read())!=-1) {

 System.out.println((char)length);

} </code=java> 2. immer 250 Zeichen einlesen <code=java> int length; char[] buffer = new char[250]; while((length=read.read(buffer))!=-1) {

 for(int i=0;i!=length;i++)
   System.out.print(buffer[i]);
 System.out.println();

} </code=java> 3. nur ab dem 250.Zeichen 4 Zeichen einlesen <code=java> int length; char[] buffer = new char[250]; length=read.read(buffer,250,4); for(int i=0;i!=length;i++)

 System.out.print(buffer[i]);

</code=java> 4. immer eine Zeile einlesen <code=java> String line; while((line=read.readLine())!=null)

 System.out.println(line);

</code=java>