这两行字都能给我写一封信 file
. 有人能告诉我他们在内部工作上有什么不同吗?
FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
fileOutputStream.write(65);
fileOutputStream.write('A');
[编辑]:我更感兴趣的是在这两种情况下转换是如何工作的。我知道什么是ascii和unicode表。
这两行字都能给我写一封信 file
. 有人能告诉我他们在内部工作上有什么不同吗?
FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
fileOutputStream.write(65);
fileOutputStream.write('A');
[编辑]:我更感兴趣的是在这两种情况下转换是如何工作的。我知道什么是ascii和unicode表。
1条答案
按热度按时间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
价值观。此转换是从char
至int
. 它相当于执行显式类型转换;即(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
输出文本时。