代码之家  ›  专栏  ›  技术社区  ›  ZZ Coder

为什么Java OutputStream.write()接受整数但写入字节

  •  30
  • ZZ Coder  · 技术社区  · 16 年前

    我正在写一个OutputStream,刚刚在OutputStream接口中注意到了这一点,

       public abstract void write(int b) throws IOException;
    

    5 回复  |  直到 16 年前
        1
  •  26
  •   sfish    16 年前

    因此,您可以发出EOF信号:

    请注意,read()返回一个int值。如果输入是一个字节流,为什么read()不返回一个字节值?使用int作为返回类型允许read()使用-1表示它已到达流的末尾

    http://java.sun.com/docs/books/tutorial/essential/io/bytestreams.html

        2
  •  10
  •   Bill K    16 年前

    事实上,我最近一直在处理字节,它们可能很烦人。它们会在最轻微的刺激下向上转换为整数,并且没有将数字转换为字节的指定——例如,8l将给您一个长值8,但对于字节,您必须说(字节)8

    最重要的是,除非您使用数组,否则它们(基本上)总是以int的形式存储在内部(甚至可能在那时..不确定)。

    我想他们只是假设使用字节的唯一原因是I/o,实际上需要8位,但在内部,他们希望您总是使用int。

    顺便说一下,一个字节的性能可能会更差,因为它总是要被屏蔽。。。

    至少我记得几年前读过这本书,现在可能已经改变了。

    作为您特定问题的示例答案,如果函数(f)取一个字节,而您有两个字节(b1和b2),则:

    f(b1 & b2)
    

    不起作用,因为b1&b2将向上转换为整数,而整数无法自动向下转换(精度损失)。因此,您必须编写以下代码:

    f( (byte)(b1 & b2) )
    

    这会让人恼火。

    不要费心问为什么b1&b2向上转化——我自己最近也在骂这个!

        3
  •  7
  •   Atmocreations    16 年前

    根据javadoc的 OutputStream ,此函数将忽略24个高阶位。我认为该方法的存在是出于兼容性的原因:因此不需要首先转换为byte,只需传递一个整数即可。

    当做

        4
  •  3
  •   Gary    16 年前

    更多背景:

    http://www.java-samples.com/showtutorial.php?tutorialid=260

    IOStream类的假设是,即使在传递int时,调用方也只关心最低8位的数据。只要调用方知道它真正在处理字节,这是可以的,但当底层数据是使用其他字符编码(如多字节Unicode)的文本时,这就成了一个问题。这就是为什么早在Java1.1中就引入了Reader类。如果您关心文本数据和性能,IOStream类会更快,但是Reader类更易于移植。

        5
  •  2
  •   Denis Tulskiy    16 年前

    可能是因为默认情况下字节是有符号的,而文件将字节存储为无符号值。这就是为什么 read() 返回一个int-表示255,而不是$FF的-1。同 write(int) ,不能将$FF存储为字节中的255。

    推荐文章