理解Java InputStream读取方法的问题

时间:2015-05-19 16:29:16

标签: java inputstream

让我们说我有一个输入流。如果我错了,请纠正我,但InputStream中的所有数据都保存为字节,例如以下文本: "为什么不用♥?" 现在我想知道,这个文本是如何转换为字节数组的,因为我不知道(例如)如何保存♥。 如果我打电话

InputStream myInputStream = os.getInputStream();
byte[] b = new byte[1];
while ((in.read(b)) != -1) {
            System.out.write(b, 0, 1);
}

然后我的byteArray(长度为1)将填充每个循环中的下一个字节。

int.read(b)

返回一个整数值,稍后将其转换为字符。 所以,如果我看一下Java文档,你会发现类似的东西:

  

从输入流中读取下一个数据字节。值字节是   以0到255之间的int返回。

我的想法是:只有255个不同的角色可能吗?推理中必定存在错误,因为我的来源中使用的字符并不重要。

那么 - 任何人都可以帮助我这个脑筋急转弯吗?很多。

2 个答案:

答案 0 :(得分:6)

将字符转换为字节(反之亦然)的过程称为"字符编码"。它可以通过许多不同的方式完成。这些转换的规则包含在Java调用Charset的内容中。 Java支持其中许多:ASCII,UTF_8,UTF_16,ISO_8859_1等。标准符可以在StandardCharsets中找到。

一些字符集认为字节和字符之间的映射是一对一的。 ISO_8859_1(AKA latin-1)就是其中之一。但是当然有一个缺点:使用这样的字符集(ISO_8859_1的西方拉丁字符)只能编码256个字符到字节。

其他一些内容,如UTF_8,每个字符使用一个,两个或更多字节,具体取决于字符。 ASCII字符(a-b,A-B,数字等)在单个字节上编码,而其他字符(重音字母,中文,西里尔文和其他字母)使用两个或更多字节。缺点是编码和解码起来比较困难,但优点是巨大的:这种编码支持每个可能的Unicode字符。

请记住,字节和字符是两个非常不同的东西,并且它们之间没有一对一的映射。使用InputStreamReader读取字符,使用OutputStreamWriter写入字符。始终指定字符集:不这样做将使用您的系统的默认编码(可能与其他系统不同)。

答案 1 :(得分:0)

需要2个字节的字符包含一个标志(在第一个字节中),它通知任何想要知道的人(包括文本编辑器)它需要另一个字节。

在你的情况下,你读取整个第一个字节,包括标志,然后读取第二个字节。它是附加它们的文本编辑器或控制台。