Die Anleitung zu Java Reader
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
Die Anleitungen Java IO
- Die Anleitung zu Java CharArrayWriter
- Die Anleitung zu Java FilterReader
- Die Anleitung zu Java FilterWriter
- Die Anleitung zu Java PrintStream
- Die Anleitung zu Java BufferedReader
- Die Anleitung zu Java BufferedWriter
- Die Anleitung zu Java StringReader
- Die Anleitung zu Java StringWriter
- Die Anleitung zu Java PipedReader
- Die Anleitung zu Java LineNumberReader
- Die Anleitung zu Java PushbackReader
- Die Anleitung zu Java PrintWriter
- Die Anleitung zu Java IO Binary Streams
- Die Anleitung zu Java IO Character Streams
- Die Anleitung zu Java BufferedOutputStream
- Die Anleitung zu Java ByteArrayOutputStream
- Die Anleitung zu Java DataOutputStream
- Die Anleitung zu Java PipedInputStream
- Die Anleitung zu Java OutputStream
- Die Anleitung zu Java ObjectOutputStream
- Die Anleitung zu Java PushbackInputStream
- Die Anleitung zu Java SequenceInputStream
- Die Anleitung zu Java BufferedInputStream
- Die Anleitung zu Java Reader
- Die Anleitung zu Java Writer
- Die Anleitung zu Java FileReader
- Die Anleitung zu Java FileWriter
- Die Anleitung zu Java CharArrayReader
- Die Anleitung zu Java ByteArrayInputStream
- Die Anleitung zu Java DataInputStream
- Die Anleitung zu Java ObjectInputStream
- Die Anleitung zu Java InputStreamReader
- Die Anleitung zu Java OutputStreamWriter
- Die Anleitung zu Java InputStream
- Die Anleitung zu Java FileInputStream
Show More
- Anleitungen Java Servlet/JSP
- Die Anleitungen Java New IO
- Anleitungen Spring Cloud
- Die Anleitungen Oracle Java ADF
- Die Anleitungen Java Collections Framework
- Java Grundlagen
- Die Anleitungen Java Date Time
- Java Open Source Bibliotheken
- Anleitungen Java Web Services
- Die Anleitungen Struts2 Framework
- Anleitungen Spring Boot