java—字节流的内部工作write(65)和write('a')之间的区别?

zbdgwd5y  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(595)

这两行字都能给我写一封信 file . 有人能告诉我他们在内部工作上有什么不同吗?

FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
fileOutputStream.write(65);
fileOutputStream.write('A');

[编辑]:我更感兴趣的是在这两种情况下转换是如何工作的。我知道什么是ascii和unicode表。

fjaof16o

fjaof16o1#

让我们从javadoc开始 FileOutputStream . 如果你看它,你会发现有三个 write 方法: void write​(byte[] b) -写入 b.length 从指定的字节数组到该文件输出流的字节数。 void write​(byte[] b, int off, int len) -写入 len 从偏移量开始的指定字节数组中的字节 off 此文件的输出流。 void write​(int b) -将指定的字节写入此文件输出流。
它告诉我们什么?
显然,当我们打电话的时候 fileOutputStream.write(65) 或者 fileOutputStream.write('A') ,我们不调用 write 方法。我们实际上是在叫第三个。
所以当我们打电话的时候 fileOutputStream.write('A') ,的 char 价值 'A' 已转换为 int 价值观。此转换是从 charint . 它相当于执行显式类型转换;即 (int) 'A' .
从整数类型(例如。 char )更大的整数类型(例如。 int )只是把它做大一点。在这种情况下,我们只需在前面加上16个零位(因为 char 未签名且 int 已签名。)
当我们查看ascii和unicode代码表时,我们看到它们都对字母大写a使用相同的值。十进制是65,十六进制是41。换句话说 (int) 'A' 以及 65 都是相同的值。
所以当你进行隐式加宽转换时, fileOutputStream.write('A') 以及 fileOutputStream.write(65) 你真的打电话来了 write 具有相同的参数值。
最后,javadoc write(int) 指这个javadoc,它说:
将指定的字节写入此输出流。写入的一般约定是将一个字节写入输出流。要写入的字节是参数b的8个低位。忽略b的24个高位。
这就解释了 int 神奇地变成了 byte .
请注意,这只打印一些合理的内容,因为我们在ascii字符集中选择了一个字符。恰好unicode选择将ascii字符集镜像为前128个unicode码点。
如果你换了 A 对于ascii字符集之外的某些字符,很有可能 OutputStream::write(int) 会把它弄得乱七八糟的。
最好使用 FileWriter 而不是一个 FileOutputStream 输出文本时。

相关问题