基于字节和基于字符的Inp​​utStream之间的差异

时间:2017-09-17 00:08:31

标签: java

我在this教程中看到了以下声明。

  

而InputStream一次返回一个字节,表示一个值   在0到255之间(如果流没有更多数据,则为-1),Reader   一次返回一个char,表示0到65535之间的值(或-1)   如果流没有更多数据)。

以下是示例代码 -

Reader reader = new FileReader("c:\\data\\myfile.txt");

int data = reader.read();
while(data != -1){
    char dataChar = (char) data;
    data = reader.read();
}

InputStream的代码也类似。而不是FileReader& Reader;使用FileInputStream和InputStream。 Reader返回char,而InputStream流返回一个字节。在这两种情况下,当我使用诸如" Hello World"之类的字符串进行测试时,它一次读取一个字符。什么是超过255的值,我可以用它来查看这些基于字节和基于字符的输入之间的差异。

工作计划

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class ReaderStream {

    public static void main(String[] args) {
        String data = "படிகஅமைப்பு";
        InputStream input = new ByteArrayInputStream(data.getBytes());
        Reader inputStream = new InputStreamReader(input);

        try {
            int readData = inputStream.read();
            while(readData != -1) {
                System.out.print((char)readData);
                readData = inputStream.read();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("");

         input = new ByteArrayInputStream(data.getBytes());

        try {
            int readData = input.read();
            while(readData != -1) {
                System.out.print((char)readData);
                readData = input.read();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

输出

படிகஅமைப்பு
பà®à®¿à®à®à®®à¯à®ªà¯à®ªà¯

1 个答案:

答案 0 :(得分:3)

基本多语言平面中的任何Unicode字符都不在ASCII集中。就个人而言,我喜欢U + 0B87இ(来自泰米尔语),或生物危害符号U + 2623☣。确保您打开的文件以Unicode编码保存(UTF-8通常是最佳选择,尽管Java在内部使用UTF-16)。