来自Herbert Schildt关于Java的书中给出的摘要。
要写入文件,可以使用FileOutputStream定义的write()方法。其最简单的形式如下所示:
void write(int byteval) throws IOException
此方法将字节指定的字节写入文件。尽管字节被声明为整数,但只有低位八位被写入文件。
这是否意味着只能写出2^8=256个组合。如果我们必须包括扩展ASCII或Unicode,该怎么办。
其次,
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
也恰好包括一些使用系统默认编码将Character
和String
值转换为字节的方法。所以,如果你的默认编码是UTF-8,你可以写
char uc = '÷'; // Unicode 0x00f7
System.out.print(uc);
输出将是2字节序列0xC3,0xB7
,它是÷
符号的UTF-8编码。