首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虽然byteval在write()中被声明为整数,但为什么在Java I/O流中只将低阶八位写入文件?

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

Stack Overflow用户
提问于 2014-10-11 06:56:35
回答 2查看 246关注 0票数 1

摘自Herbert 关于Java一书的摘要。

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

代码语言:javascript
复制
void write(int byteval) throws IOException

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

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

第二,

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

代码语言:javascript
复制
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( )完成。这些方法由System.out).引用的类PrintStream (即对象的类型)定义。尽管System.out是一个字节流,但是将它用于简单的程序输出仍然是可以接受的。因为OutputStream,是从PrintStream派生出来的输出流,所以它还实现了低级方法write( )。因此,可以使用 write ( )向控制台写入。PrintStream定义的最简单的write( )形式如下所示:

代码语言:javascript
复制
void write(int byteval)

此方法将byteval指定的字节写入流。尽管byteval被声明为整数,但只写入了低阶8位.下面是一个简短的示例,它使用write( )输出字符“A”,后面跟着屏幕上的换行符:

代码语言:javascript
复制
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');

  }
}

输出:

代码语言:javascript
复制
A
A
A

尽管System.out是一个字节流,但是为什么它以字符的形式输出而不是以字节的形式输出。(或者说我做错了。字节流与输出的表示无关。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-11 08:16:57

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

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

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

System.out是一个PrintStream,它是一种混合。它基本上是一个字节流,因此write(65)编写ASCII字符A。但是,PrintStream还碰巧包括一些使用系统默认编码将CharacterString值转换为字节的方法。因此,如果您的默认编码是UTF-8,则可以编写

代码语言:javascript
复制
char uc = '÷';         // Unicode 0x00f7
System.out.print(uc);

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

票数 1
EN

Stack Overflow用户

发布于 2014-10-11 07:12:17

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

因此,如果您想打印65,您必须System.out.write("65");

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26311978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档