【问题标题】:Difference between Byte Based and Char Based InputStreams [duplicate]基于字节和基于字符的输入流之间的区别[重复]
【发布时间】:2018-02-25 19:48:12
【问题描述】:

我在this 教程中看到了以下语句。

而 InputStream 一次返回一个字节,表示一个值 介于 0 和 255 之间(如果流没有更多数据,则为 -1),Reader 一次返回一个字符,表示 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();
        }

    }

}

输出

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

【问题讨论】:

  • ReaderInputStream 有不同的用途。请使用它们的用途的方法/类! Reader 字符数据,InputStream 原始/二进制数据。随意在螺丝上使用锤子,但不要抱怨(或问为什么它不工作)。请参阅文章@nullpointer ... 指向。
  • @sruetti 我理解其中的区别。我刚刚编写了这个程序来查看 inputstream 是否返回值 0 到 255 与 Reader 返回值 0 到 65535。感谢您的输入。

标签: java


【解决方案1】:

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

【讨论】:

  • @PunterVicky 虽然听起来你已经掌握了不同之处,但如果没有,尝试一个包含 ASCII 字符 非ASCII BMP 字符。使用 InputStream 的预期输出很好地再现了 ASCII 输出,非 ASCII 输出被您在泰米尔语中看到的那种 mojibake 所取代。
  • 是的,我已经掌握了窍门。我会试试你的建议。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2020-07-21
  • 2023-02-05
  • 2021-07-23
  • 1970-01-01
相关资源
最近更新 更多