字节流和相关的东西

时间:2014-01-21 15:37:47

标签: java

我有几个与字节流有关的问题,它们是如何操作的。如果你有一些新的友好链接,它将是最好的。

1)当我将字节流保存到某些txt(例如writeInt方法)时,我得到了乱码字符。他们来自哪里?文本编辑器尝试解码字节,但为什么不成功?同时来自writeBytes()类的DataOutputStream也将字符串写为字节序列,但这次它在文本编辑器中显示为字符。为什么?

2)使用了什么DataOutputStream过滤器,它添加了什么?据说DataOutputStream可以直接从流中编写各种类型(intdouble ...)。这是什么意思?

4)如果我每个有2个docx 1000个字符,则第1个使用英文字符,第2个例如俄罗斯人物。俄罗斯文件不应该更大(因为据我所知,所有这些奇怪的字母可能需要超过1个字节)。但它似乎不是这样的。

5)字节和字符流在实现方面有什么区别 - 既保存字节序列,又将字符串分成几部分?这是如何完成的?

谢谢!

1 个答案:

答案 0 :(得分:5)

Java在以下方面存在概念上的区别:

  • 二进制数据:byte[], InputStream, OutputStream
  • 文字(Unicode):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