尽管字节值在write()中被声明为整数,但为什么在Java I/O流中只有低位八位被写入文件



来自Herbert Schildt关于Java的书中给出的摘要。

要写入文件,可以使用FileOutputStream定义的write()方法。其最简单的形式如下所示:

void write(int byteval) throws IOException

此方法字节指定的字节写入文件。尽管字节被声明为整数,但只有低位八位被写入文件。

这是否意味着只能写出2^8=256个组合。如果我们必须包括扩展ASCIIUnicode,该怎么办。

其次,

Java定义了两种类型的字节>字符[/strong>。字节流为处理字节的输入和输出提供了一种方便的方式。例如,在读取或写入二进制数据时使用字节流。字符流为处理字符的输入和输出提供了一种方便的方式。它们使用Unicode,因此可以国际化。此外,在某些情况下,字符流比字节流更有效率。

At the lowest level, all I/O is still byte-oriented. The character-based streams simply provide a  
convenient and efficient means for handling characters.

控制台输出最容易通过print()println()来完成。这些方法由类PrintStream定义(这是>System.out引用的对象的类型)。即使System.out字节流,将其用于简单程序输出仍然是可以接受的。因为PrintStream是从OutputStream派生的输出流,所以它还实现了低级方法write()。因此,write()可用于写入控制台PrintStream定义的最简单的write()形式如下所示:

void write(int byteval)

此方法将byteval指定的字节写入流。尽管字节值被声明为整数,但只写入低位的八位。下面是一个使用write()将字符"a"后跟换行符输出到屏幕的简短示例:

class WriteDemo {
   public static void main(String args[]) {
    int b;
    b = 'A';
    System.out.write(b);
    System.out.write('n');
    System.out.write(65);
    System.out.write('n');
    System.out.write('A');
    System.out.write('n');
  }
}

输出:

A
A
A

即使System.out字节流,为什么它以字符的形式输出而不是以字节的形式输出。(或者我错了。字节流与输出的表示无关。)

因为System.out是默认分配(控制台输出)的PrintStream,所以对System.out.write(int)的任何调用都会将int值转换为ASCII字符。

所以,如果你想打印65,你必须System.out.write("65");

一切都取决于分配给您的作者的流。

在Java程序之外,一切都是字节流。

在Java中,流是原始字节。您可以直接使用流访问未经修改的"本机"形式的外部数据。

Java阅读器是使用某种编码约定(即UTF-8、ISO-8850-1)在字节和字符(16位实体)之间转换的流的包装器。

System.out是一个PrintStream,它是一种混合体。它基本上是一个字节流,因此write(65)写入ASCII字符A。然而,PrintStream也恰好包括一些使用系统默认编码将CharacterString值转换为字节的方法。所以,如果你的默认编码是UTF-8,你可以写

char uc = '÷';         // Unicode 0x00f7
System.out.print(uc);

输出将是2字节序列0xC3,0xB7,它是÷符号的UTF-8编码。

相关内容

  • 没有找到相关文章

最新更新