理解Java InputStream读取方法的问题

Cod*_*bal 3 java inputstream

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

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

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

int.read(b)
Run Code Online (Sandbox Code Playgroud)

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

从输入流中读取下一个数据字节.值字节作为int返回,范围为0到255.

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

所以 - 任何人都可以帮助我这个脑筋急转弯吗?多谢.

JB *_*zet 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字符(ab,AB,数字等)在单个字节上编码,而其他(重音字母,中文,西里尔和其他字母)使用两个或更多字节.缺点是编码和解码更难,但优点是巨大的:这种编码支持每个可能的Unicode字符.

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