Java InputStream read方法理解困难问题

3

假设我有一个Inputstream。如果我说错了,请纠正我,但是InputStream中的所有数据都保存为字节,例如以下文本:“为什么不用♥?” 现在我想知道,这个文本如何转换为字节数组,因为我不知道(例如)那个♥是如何保存的。 如果我调用

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

然后在每个循环中,我的字节数组(长度为1)将被填充下一个字节。

int.read(b)

返回一个整数值,稍后将其转换为字符。因此,如果查看Java文档,您会发现类似于以下内容:

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

我的想法是:只有255个不同的字符可能吗?这必须是一种错误的推理,因为在源代码中使用了哪些字符并不重要。

所以 - 有人能帮我解开这个谜题吗?非常感谢。


“255个不同的字符可能吗?”如果你将一个2字节字符(仅作为示例)拆分为两个单字节字符,那么是的。 - Tom
2个回答

6
将字符转换为字节(反之亦然)的过程称为“字符编码”。它可以通过许多不同的方式完成。这些转换的规则包含在Java所称的Charset中。Java支持许多字符集:ASCII,UTF_8,UTF_16,ISO_8859_1等。标准字符集可以在StandardCharsets中找到。
一些字符集认为字节和字符之间的映射是一对一的。ISO_8859_1(也称为拉丁-1)就是其中之一。但当然有一个缺点:只有256个字符可以使用这样的字符集进行编码(ISO_8859_1用于西方拉丁字符)。
一些编码方式,例如UTF_8,根据字符的不同使用一个、两个或多个字节进行编码。ASCII字符(a-b,A-B,数字等)使用单个字节进行编码,而其他字符(带重音符号的字母,中文,西里尔字母和其他字母)使用两个或多个字节进行编码。缺点是编码和解码更加困难,但优点是巨大的:这种编码支持每个可能的Unicode字符。
请记住,字节和字符是两个非常不同的概念,并且它们之间没有一对一的映射关系。使用InputStreamReader读取字符,使用OutputStreamWriter写入字符。始终指定字符集:不这样做将使用系统的默认编码(可能与另一个系统不同)。

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接