betacode

Руководство Java InputStreamReader

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

1. InputStreamReader

InputStreamReader - это подкласс Reader, который представляет собой мост, позволяющий преобразовать byte stream в character stream. Другими словами, он позволяет преобразовать InputStream в Reader.
Совет: Чтобы преобразовать "InputStream" в "Reader", вам просто нужно объединить эти два слова для формирования слова "InputStreamReader", и вы получите решение проблемы.
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 - довольно распространенная кодировка (encoding) для китайского или японского текста. В этом примере мы проанализируем, как InputStreamReader читает тексты UTF-16.
Прежде всего, взгляните на приведенный ниже японский текстовый файл, который закодирован в UTF-16:
utf16-file-with-bom.txt
JP日本-八洲
Полный код примера:
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
Создайте объект InputStreamReader с кодировкой UTF-16 и оберните объект InputStream:
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");
На рисунке ниже показаны bytes в файле UTF-16. Первые два bytes(254 255) используются для обозначения того, что это начало текста UTF-16.
UTF-16 InputStreamReader считывает первые 2 bytes для определения кодировки текста, и знает, что он работает с текстом UTF-16. Он соединяет 2 последовательных bytes, образуя один символ...

3. UTF-8 InputStreamReader

UTF-8 - это самая популярная в мире кодировка (encoding), которая может кодировать все письменности в мире, включая китайские иероглифы и японские иероглифы. Теперь мы проанализируем, как InputStreamReader читает тексты UTF-8.
Прежде всего, взгляните на приведенный ниже японский текстовый файл, который закодирован в UTF-8:
utf8-file-without-bom.txt
JP日本-八洲
Полный код примера:
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
Создайте объект InputStreamReader с кодировкой UTF-8 и оберните объект InputStream:
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");
На рисунке ниже показаны bytes в файле UFT-8:
Кодировка UTF-8 намного сложнее, чем UTF-16. Для хранения символа требуется 1, 2, 3 или 4 bytes. Это зависит от кода символа.
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
На рисунке ниже приведен пример, показывающий, как UTF-8 InputStreamReader превращает 3 bytesUTF-8 в 2 bytes Java-символ:

Руководства Java IO

Show More