java - 虽然 write() 中将 byteval 声明为整数,但为什么 Java I/O 流中只将低位八位写入文件

标签 java unicode io stream

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

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

void write(int byteval) throws IOException

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

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

其次,

Java 定义了两种类型的:字节字符>。字节流提供了处理字节输入和输出的便捷方法。例如,在读取或写入二进制数据时使用字节流。字符流提供了处理字符输入和输出的便捷方法。它们使用 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 指定的字节写入流。尽管 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是一个字节流,那为什么它是以Characters的形式输出而不是以字符的形式输出字节。 (或者我理解错了。字节流与输出的表示无关。)

最佳答案

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

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

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

关于java - 虽然 write() 中将 byteval 声明为整数,但为什么 Java I/O 流中只将低位八位写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26311978/

相关文章:

用于字体图标的 ios 动态 unicode NSString

python - 无法使用 SWIG 将 C++ 创建的 UTF-16 字符串缓冲区转换为 python

c++ - 将 C++ 的相同功能/概念转换为序言

java - 如何修复 try block 以便从 txt 文件中获取平均值?

Java使用sax来解析xml文件。出现时无法获取正确的内容

java - AsyncTask 是一个内部类 : get onPostExecute() result in Service

java - 从 Arraylist 返回对象

python - 如何使用 python 将 unicode 元组列表转换为 utf-8

java - 如何计算空行的位置?

java - JPA + Hibernate = EntityManager 没有持久性提供者