codestory

Die Anleitung zu Java Reader

  1. Reader
  2. read()
  3. read(char[])
  4. read(char[], int, int)
  5. read(java.nio.CharBuffer)
  6. close()
  7. skip(long)
  8. transferTo(Writer)
  9. markSupported()
  10. mark(int)
  11. reset()
  12. ready()

1. Reader

Reader ist eine Klasse im Paket java.io, eine Basisklasse, die einen Zeichenstrom darstellt (stream of characters), der beim Lesen einer bestimmten Datenquelle, z.B einer Textdatei, erhalten wird.
public abstract class Reader implements Readable, Closeable
Grundsätzlich können Sie die Klasse Reader nicht direkt verwenden, das es sich um eine abstrakte Klasse handelt. In bestimmten Fällen können Sie jedoch eine der Unterklassen verwenden.
Sehen wir uns ein Szenario zum Lesen einer Textdatei mit Code UTF-8 an:
utf-8-file.txt
JP日本-八洲
UTF-8 verwendet 1, 2, 3 oder 4 bytes zum Speichern eines Zeichens. Das Bild unten zeigt die bytes in der oben genannten Datei.
FileReader ist eine Unterklasse von Reader, die häufig zum Lesen von Textdateien verwendet wird, und wir erhalten einen Zeichenstrom (stream of characters). Irgendwie werden die Zeichen UTF-8 in die Zeichen von Java konvertiert.
Hinweis: Der Zeichentyp char in Java ist 2 bytes groß. Daher sind die Zeichen in FileReader die 2 bytes Zeichen.
Sehen Sie auch meine Erklärung, wie Java die Zeichen UTF-8 in die Zeichen Java konvertiert:
Reader Methods
public static Reader nullReader()   

public int read(java.nio.CharBuffer target) throws IOException  

public int read() throws IOException  

public int read(char cbuf[]) throws IOException  

public int read(char cbuf[], int off, int len) throws IOException  

public long skip(long n) throws IOException  

public boolean ready() throws IOException   

public boolean markSupported()  

public void mark(int readAheadLimit) throws IOException  

public void reset() throws IOException   

public void close() throws IOException  

public long transferTo(Writer out) throws IOException

2. read()

public int read() throws IOException
Die Methode read() wird verwendet, um ein Zeichen zu lesen, das die Kode der gerade gelesenen Zeichen zurückgibt (ein Integer zwischen 0 und 65535), oder -1 wenn es das Ende des Streams erreicht hat.
Diese Methode wird blockiert, bis das verfügbare Zeichen oder einen Fehler IO auftritt oder das Ende des Streams erreicht hat.
Zum Beispiel:
Reader_read_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_read_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("JP日本-八洲");

        int charCode;
        while((charCode = reader.read()) != -1) {
            System.out.println((char)charCode + " " + charCode);
        }
        reader.close();
    }
}
Output:
J 74
P 80
日 26085
本 26412
- 45
八 20843
洲 27954

3. read(char[])

public int read(char[] cbuf) throws IOException
Die Methode read(char[]) liest Zeichen und weist die Elemente des Arrays zu und gibt die Anzahl der gerade gelesenen Zeichen zurück. Diese Methode gibt -1 zurück, wenn das Ende des Stream erreicht ist.
Diese Methode wird blockiert, bis die Zeichen verfügbar sind oder einen Fehler IO auftritt oder das Ende des Stream erreicht hat.
Grundsätzlich hat die Verwendung der Methode read(char[]) eine bessere Leistung als die Methode read(), da dadurch weniger häufiger aus dem Stream gelesen werden muss.
Reader_read_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_read_ex2 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-12345");
 
        // Create a temporary char array.
        char[] temp = new char[10];
        int charCount = -1;
         
        while ((charCount = reader.read(temp)) != -1) {
            String s = new String(temp, 0, charCount);
            System.out.println(s);
        }
        reader.close();
    }
}
Output:
123456789-
987654321-
12345

4. read(char[], int, int)

public int read(char[] cbuf, int offset, int len) throws IOException
Die Methode read(char[],int,int) liest die Zeichen und weist die Elemente des Arrays vom Index offset zum Index offset+len, und gibt die Anzahl der gerade gelesenen Zeichen zurück. Diese Methode gibt -1 zurück wenn das Ende des Streams erreicht wird.
Diese Methode wird blockiert, bis die Zeichen verfügbar sind oder den Fehler IO auftritt, oder das Ende des Streams erreicht ist.

5. read(java.nio.CharBuffer)

public int read(java.nio.CharBuffer target) throws IOException
Die Methode read(CharBuffer) wird verwendet um die Zeichen in ein Objekt CharBufffer zu lesen und die Anzahl der aus dem Stream gelesenen Zeichen oder -1 zurückzugeben wenn das Ende des Streams erreicht ist.
Die Methode wird blockiert, bis die Zeichen verfügbar sind oder einen Fehler IO auftritt oder wenn das Ende des Streams erreicht ist.
Reader_read_ex3.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.nio.CharBuffer;

public class Reader_read_ex3 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-12345");
 
        CharBuffer cb = CharBuffer.allocate(10);
    
        // Read for the first time
        reader.read(cb);
        System.out.println(cb.flip().toString());
        
        // Read for the second time
        reader.read(cb);
        System.out.println(cb.flip().toString());
        
        // Read for the third time.
        reader.read(cb);
        System.out.println(cb.flip().toString());
        
        reader.close();  
    }
}
Output:
123456789-
987654321-
12345
  • Die Anleitung zu Java CharBuffer

6. close()

public void close() throws IOException
Schließt den Stream und gibt alle damit verbundenen Systemressourcen frei. Sobald der Stream geschlossen wurde, werden die Aufrufsbefehle von read(), ready(), mark(), reset() oder skip() eine IOException ausgelöst. Das Schließend eines vorher geschlossenen Streams hat keine Auswirkung.
public interface Closeable extends AutoCloseable
Die Klasse Reader implementiert die Interface Closeable. Wenn Sie die Kode nach den Regeln von AutoCloseable schreiben, schließt das System den Stream automatisch für Sie, ohne die Methode close() direkt aufrufen zu müssen.
Reader_close_ex1.java
package org.o7planning.reader.ex;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class Reader_close_ex1 {
    
    // Or Windows path: C:/Somefolder/utf8-file-without-bom.txt
    private static final String file_path = "/Volumes/Data/test/utf8-file-without-bom.txt";

    public static void main(String[] args) throws IOException {
        
        // (Reader class implements Closeable)
        // (Closeable interface extends AutoCloseable)
        // try block will automatically close stream for you.
        try (Reader fileReader= new FileReader(file_path)) {
            int code;
            while((code = fileReader.read()) !=  -1)  {
                System.out.println((char)code);
            }
        } // end try
    }
}
  • Die Anleitung zu Java Closeable

7. skip(long)

public long skip(long n) throws IOException
Die Methode skip(long) überspringt "n" Zeichens.
Die Methode wird blockiert, bis die Zeichen verfügbar sind oder den Fehler IO auftritt oder das Ende des Streams erreicht hat.
Reader_skip_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_skip_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-ABCDE");

        int firstCharCode = reader.read();
        int secondCharCode = reader.read();

        System.out.println("First character: " + (char) firstCharCode);
        System.out.println("Second character: " + (char) secondCharCode);

        reader.skip(18); // Skips 18 characters.

        int code;
        while ((code = reader.read()) != -1) {
            System.out.println((char) code);
        }
        reader.close();
    }
}
Output:
First character: 1
Second character: 2
A
B
C
D
E

8. transferTo(Writer)

// Java 10+
public long transferTo(Writer out) throws IOException
Die Methode transferTo(Writer) wird verwendet, um alle Zeichen aus dem aktuellen Reader zu lesen, in das angegebene Objekt Writer zu schreiben und die Anzahl der Zeichen zurückzugeben, die an Writer übertragen werden. Nach der Fertigung befindet sich das aktuelle Objekt Reader am Ende des Streams. Diese Methode schließt weder das aktuelle Objekt Reader noch das Objekt Writer.
Reader_transferTo_ex1.java
package org.o7planning.reader.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;

public class Reader_transferTo_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-ABCDE");

        // Or Windows path: C:/Somepath/out-file.txt
        File file = new File("/Volumes/Data/test/out-file.txt");
        // Create parent folder.
        file.getParentFile().mkdirs();

        Writer writer = new FileWriter(file);

        reader.skip(10); // Skips 10 characters.

        reader.transferTo(writer);

        reader.close();
        writer.close();
    }
}
Output:
out-file.txt
987654321-ABCDE

9. markSupported()

public boolean markSupported()
Mit der Methode markSupported() wird überprüft, ob das aktuelle Objekt Reader den Vorgang mark(int) unterstütz oder nicht. (Sehen Sie mehr die Methode mark(int))
Reader
markSupported()?
StringReader
true
CharArrayReader
true
BufferedReader
true
LineNumberReader
true
FilterReader
true or false
InputStreamReader
false
FileReader
false
PushbackReader
false

10. mark(int)

public void mark(int readAheadLimit) throws IOException
Mit der Methode mark(int) können Sie die aktuelle Position im Stream markieren. Sie können das nächste Zeichen weiter lesen und die Methode reset() aufrufen, um zur vorher markierten Position zurückzukehren, in der readAheadLimit die maximale Anzahl von Zeichen ist, die nach dem Markieren gelesen werden können, ohne die markierte Position zu verlieren.
Hinweis: Nicht alle Reader unterstützen den Vorgang mark(int). Um sicherzustellen, dass Sie die Methode markSupported() aufrufen müssen, um zu überprüfen, ob das aktuelle Objekt Reader diesen Vorgang unterstützt.
Reader_mark_ex1.java
package org.o7planning.reader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Reader_mark_ex1 {

    public static void main(String[] args) throws IOException {
        // StringReader is a subclass of Reader.
        Reader reader = new StringReader("123456789-987654321-ABCDE");

        reader.skip(10); // Skips 10 characters.

        System.out.println("StringReader markSupported? " + reader.markSupported()); // true
        
        reader.mark(9);
        
        int code1 = reader.read();
        int code2 = reader.read();
        
        System.out.println((char) code1); // '9'
        System.out.println((char) code2); // '8'
        reader.skip(5);
        
        System.out.println("Reset");
        reader.reset(); // Return to the marked position.
        
        int code;
        while((code = reader.read())!= -1) {
            System.out.println((char)code);
        }
        reader.close();
    }
}
Output:
StringReader markSupported? true
9
8
Reset
9
8
7
6
5
4
3
2
1
-
A
B
C
D
E

11. reset()

public void reset() throws IOException
Wenn dieses Objekt Reader das Markieren der aktuellen Position mit der Methode mark(int) unterstützt, wird die Methode reset() verwendet um zur markierten Position zurückzukehren.

12. ready()

public boolean ready() throws IOException
Die Methode ready() gibt true zurück wenn ein Zeichen im Stream zum Lesen verfügbar ist, ohne warten zu müssen. Umgekehrts wird false zurückgegeben.

Die Anleitungen Java IO

Show More