betacode

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

View more Tutorials:

Сайт бесплатного изучения языков:
Следуйте за нами на нашей фан-странице, чтобы получать уведомления каждый раз, когда появляются новые статьи. Facebook

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 bytes UTF-8 в 2 bytes Java-символ​​​​​​​:

View more Tutorials: