codestory

Die Anleitung zu Java InputStreamReader

  1. InputStreamReader
  2. UTF-16 InputStreamReader
  3. UTF-8 InputStreamReader

1. InputStreamReader

InputStreamReader ist eine Unterklasse von Reader. Er ist eine Brücke, damit Sie ein byte stream ins character stream umwandeln können. Oder anders gesagt, mit ihm können Sie ein InputStream ins Reader umwandeln.
Tipp: Um einen "InputStream" in einen "Reader" umzuwandeln, müssen Sie nur diese beiden Wörter hängen, um das Wort "InputStreamReader" zu bilden. Dann bekommen Sie eine Lösung des Problem.
InputStreamReader​ constructors
InputStreamReader​(InputStream in)    

InputStreamReader​(InputStream in, String charsetName)    

InputStreamReader​(InputStream in, Charset cs)    

InputStreamReader​(InputStream in, CharsetDecoder dec)

2. UTF-16 InputStreamReader

UTF-16 ist eine übliche Kode (encoding) für die chinesischen oder japanischen Text. In diesem Beispiel werden wir analysieren, wie InputStreamReader den Text UTF-16 lesen kann.
Zum ersten schauen Sie sich den japanischen Text an, der UTF-16 kodiert wird:
utf16-file-with-bom.txt
JP日本-八洲
Die volle Kode vom Beispiel:
InputStreamReader_UTF16_Ex1.java
package org.o7planning.inputstreamreader.ex;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class InputStreamReader_UTF16_Ex1 {

    // A file in UTF-16.
    private static final String fileURL = "https://s3.o7planning.com/txt/utf16-file-with-bom.txt";
    
    public static void main(String[] args) throws MalformedURLException, IOException {
        System.out.println(" --- Characters in Character Stream (InputStreamReader) ---");
        readAs_UTF16_Character_Stream();

        System.out.println();
        System.out.println(" --- Bytes in UTF-16 file ---");
        readAs_Binary_Stream();
    }

    private static void readAs_UTF16_Character_Stream() throws MalformedURLException, IOException {

        InputStream is = new URL(fileURL).openStream();
        InputStreamReader isr = new InputStreamReader(is, "UTF-16");

        int charCode;
        while ((charCode = isr.read()) != -1) { // Read each character.
            System.out.println((char) charCode + "  " + charCode);
        }
        isr.close();
    }

    private static void readAs_Binary_Stream() throws MalformedURLException, IOException {

        InputStream is = new URL(fileURL).openStream();

        int byteValue;
        while ((byteValue = is.read()) != -1) { // Read each byte.
            System.out.println((char) byteValue + "  " + byteValue);
        }
        is.close();
    }
}
Output:
--- Characters in Character Stream (InputStreamReader) ---
J  74
P  80
日  26085
本  26412
-  45
八  20843
洲  27954

 --- Bytes in UTF-16 file ---
þ  254
ÿ  255
  0
J  74
  0
P  80
e  101
å  229
g  103
,  44
  0
-  45
Q  81
k  107
m  109
2  50
Erstellen Sie ein Objekt InputStreamReader mit dem Kodierung UTF-16, das um ein Objekt InputStream umgibt:
String url = "https://s3.o7planning.com/txt/utf16-file-with-bom.txt";

InputStream is = new URL(url).openStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-16");
Das folgende Bild zeigt die bytes in die File UTF-16 an. Die zwei ersten bytes(254, 255) wird verwendet um zu markieren, dass es einen Text UTF-16 beginnt.
UTF-16 InputStreamReader liest 2 ersten bytes um das Kodierungsstil des Text festzulegen und kenn, dass es mit einem Text UTF-16 arbeitet. Es verbindet zwei aufeinanderfolgende bytes um ein Zeichen zu bilden...

3. UTF-8 InputStreamReader

UTF-8 ist die weltweit üblichste Kodierung. Es kann alle Schriftarten der Welt kodieren, einschließlich chinesischer und japanischer Schriftzeichen. Jetzt werden wir analysieren, wie InputStreamReader die Texte UTF-8 liest.
Zum ersten schauen Sie den japansichen Text unten an. Er wird UTF-8 kodiert:
utf8-file-without-bom.txt
JP日本-八洲
Die volle Kode des Beispiel:
InputStreamReader_UTF8_Ex1.java
package org.o7planning.inputstreamreader.ex;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class InputStreamReader_UTF8_Ex1 {

    // A file with UTF-8 encoding (And without BOM (Byte Order Mark)).
    private static final String fileURL = "https://s3.o7planning.com/txt/utf8-file-without-bom.txt";
    
    public static void main(String[] args) throws MalformedURLException, IOException {
        System.out.println(" --- Characters in Character Stream (InputStreamReader) ---");
        readAs_UTF8_Character_Stream();

        System.out.println();
        System.out.println(" --- Bytes in UTF-8 file ---");
        readAs_Binary_Stream();
    }

    private static void readAs_UTF8_Character_Stream() throws MalformedURLException, IOException {
        
        InputStream is = new URL(fileURL).openStream();
        InputStreamReader isr = new InputStreamReader(is, "UTF-8");

        int charCode;
        while ((charCode = isr.read()) != -1) { // Read each character.
            System.out.println((char) charCode + "  " + charCode);
        }
        isr.close();
    }

    private static void readAs_Binary_Stream() throws MalformedURLException, IOException {

        InputStream is = new URL(fileURL).openStream();

        int byteValue;
        while ((byteValue = is.read()) != -1) { // Read each byte.
            System.out.println((char) byteValue + "  " + byteValue);
        }
        is.close();
    }
}
Output:
--- Characters in Character Stream (InputStreamReader) ---
J  74
P  80
日  26085
本  26412
-  45
八  20843
洲  27954

 --- Bytes in UTF-8 file ---
J  74
P  80
æ  230
—  151
¥  165
æ  230
œ  156
¬  172
-  45
å  229
…  133
«  171
æ  230
´  180
²  178
Erstellen Sie ein Objekt InputStreamReader mit der Kodierung UTF-8, das um ein Objekt InputStream umgibt:
String url = "https://s3.o7planning.com/txt/utf8-file-without-bom.txt";

InputStream is = new URL(url).openStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
Das folgende Bild zeigt die bytes in die File UTF-8:
Die Kodierung UTF-8 ist mehr komplizierter als UTF-16, sie braucht 1, 2, 3 oder 4 bytes um einen Zeichen zu speichern. Das hängt von der Zeichenskode ab.
Number of bytes
From
To
Byte 1
Byte 2
Byte 3
Byte 4
1
U+0000
0
U+007F
127
0xxxxxxx
2
U+0080
128
U+07FF
2047
110xxxxx
10xxxxxx
3
U+0800
2048
U+FFFF
65535
1110xxxx
10xxxxxx
10xxxxxx
4
U+10000
65536
U+10FFFF
1114111
11110xxx
10xxxxxx
10xxxxxx
10xxxxxx
Das folgende Bild ist ein Beispiel, in dem UTF-8 InputStreamReader 3 bytes von UTF-8 in ein 2 bytes Zeichen von Java wandelt:

Die Anleitungen Java IO

Show More