我有几个与字节流有关的问题,它们是如何操作的。如果你有一些新的友好链接,它将是最好的。
1)当我将字节流保存到某些txt(例如writeInt方法)时,我得到了乱码字符。他们来自哪里?文本编辑器尝试解码字节,但为什么不成功?同时来自writeBytes()
类的DataOutputStream
也将字符串写为字节序列,但这次它在文本编辑器中显示为字符。为什么?
2)使用了什么DataOutputStream
过滤器,它添加了什么?据说DataOutputStream
可以直接从流中编写各种类型(int
,double
...)。这是什么意思?
4)如果我每个有2个docx 1000个字符,则第1个使用英文字符,第2个例如俄罗斯人物。俄罗斯文件不应该更大(因为据我所知,所有这些奇怪的字母可能需要超过1个字节)。但它似乎不是这样的。
5)字节和字符流在实现方面有什么区别 - 既保存字节序列,又将字符串分成几部分?这是如何完成的?
谢谢!
答案 0 :(得分:5)
Java在以下方面存在概念上的区别:
byte[], InputStream, OutputStream
String, char, Reader, Writer
InputStreamReader, OutputStreamWriter, String.getBytes(charset), new String(bytes, charset)
int由4个字节组成,例如0,0,2,12,用于2 * 256 + 12 = 524.在文件中,这些字节是不可识别的。
ASCII或几乎任何字符集中Integer.toString(524)
=“524”的文本表示形式如下:
byte[] bytes = "542".getBytes("UTF-8"); // Three bytes: 53, 50, 52
DataOutputStream 是Java对象的特殊(二进制数据)OutputStream。它还可以输出一个字符串,作为UTF-8字节,这是人类可识别的,在一堆二进制值中。
docx 格式(与 odt 格式一样)是一个压缩目录,内容为XML文件。 XML通常是UTF-8,而西里尔语则更多。然而,压缩会使问题变得混乱。
Unicode 是适合[0,2 24 )的所有字符的编号。 Unicode的多字节编码 UTF-8 ,前128个ASCII字符使用一个字节,其余为多个字节。在那些多字节序列中,找不到\
左右(高位设置),这很舒服。此外,字节0可以冗余地写为多字节序列,这对于基于C的软件(如操作系统)来说很好,它将0字节解释为字符串终止符(不是Java)。 UTF-16 使用两个字节,并且可以处理几乎所有非亚洲脚本。如果Unicode数字高于2 16 ,则使用类似的机制来处理一个Unicode字符的char序列。对于两个字节的顺序,有UTF-16LE(小端)和UTF-16BE(大端)。在int示例中,使用big-endian。英特尔处理器/ Windows使用小端。
评论后:
字节是8位(0或1)的单位,其值为00000000(= 0),...,11111111(= 255)。 ASCII字符将某些字符分配给0到127之间的数字,如:
32 = ' ' 64 = '@'
48 = '0' 65 = 'A'
49 = '1' 66 = 'B'
关于二进制数字,请参阅wikipedia。