黑马程序员技术交流社区

标题: 我用字节流的read();读取一个字节,为什么输出的是一个字符的对应ASCII的值 [打印本页]

作者: 马上都有    时间: 2014-4-13 23:45
标题: 我用字节流的read();读取一个字节,为什么输出的是一个字符的对应ASCII的值
import java.io.*;
class aa
{
        public static void main(String[] args) throws IOException
        {
                FileInputStream fis = new FileInputStream("aa.java");
                System.out.println(fis.read());
        }
}

作者: zhangbingyuan    时间: 2014-4-13 23:59
read()方法返回的就是读取的当前字符对应的ASCII码
你用System.out.println( (char)fis.read() );  就可以得到读入的字符了
作者: 呆呆沙师妹    时间: 2014-4-14 09:42
字符流和字节流区别在于,字符流比字节流多了查编码表动作。
你使用字节流读取,略去了查表功能,得到的结果就是未查表的数值结果。
作者: Linuxgg    时间: 2014-4-14 10:22
查了下手册:
  1. int        read()
  2.           从此输入流中读取一个数据字节。
复制代码


源代码:
  1.     /**
  2.      * Reads a byte of data from this input stream. This method blocks
  3.      * if no input is yet available.
  4.      *
  5.      * @return     the next byte of data, or <code>-1</code> if the end of the
  6.      *             file is reached.
  7.      * @exception  IOException  if an I/O error occurs.
  8.      */
  9.     public native int read() throws IOException;
复制代码

作者: 曹冬明    时间: 2014-4-14 10:52
ASCII码就是老美用的编码,只有一个字节的后七位,read方法读到一个字节,也就是八位,当然读到的就是ASCII值了
作者: 周建岐    时间: 2014-4-14 13:01
javaApi写的很清楚啊,用stream输入,当然是字节啦,一字节,当然是ascII码啦

作者: 马上都有    时间: 2014-4-14 14:24
zhangbingyuan 发表于 2014-4-13 23:59
read()方法返回的就是读取的当前字符对应的ASCII码
你用System.out.println( (char)fis.read() );  就可以 ...

我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗?而我才读一个字节,怎么输出两个是占字节的一个字符?
作者: 马上都有    时间: 2014-4-14 14:27
呆呆沙师妹 发表于 2014-4-14 09:42
字符流和字节流区别在于,字符流比字节流多了查编码表动作。
你使用字节流读取,略去了查表功能,得到的结 ...

我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗?而我才读一个字节,怎么输出两个是占字节的一个字符?
作者: 马上都有    时间: 2014-4-14 14:39
Linuxgg 发表于 2014-4-14 10:22
查了下手册:

我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗?而我才读一个字节,怎么输出两个是占字节的一个字符?
作者: 马上都有    时间: 2014-4-14 14:43
曹冬明 发表于 2014-4-14 10:52
ASCII码就是老美用的编码,只有一个字节的后七位,read方法读到一个字节,也就是八位,当然读到的就是ASCII ...

我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗?而我才读一个字节,怎么输出两个是占字节的一个字符?而你这样说,读取一个字节的后8位,那怎么会输出的是点两个字节的一个字符呢?
作者: 呆呆沙师妹    时间: 2014-4-14 19:22
马上都有 发表于 2014-4-14 14:27
我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗? ...

Java采用的是Unicode编码,即16进制编码,故一个字符实际占两个字节。
但FileInputStream类中read()方法查API文档可知,该方法返回的数据类型是int。
虽然字节流读取的是字节,但Java默认的数值类型是int,对于char、short、byte类型数据会自动提升为int类型。
作者: 曹冬明    时间: 2014-4-14 23:10
马上都有 发表于 2014-4-14 14:43
我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗? ...

你输入的一个字节,系统拿到,你在记事本里看到的都是系统通过查表得的结果了,不是你说的两个字符,read()读的一个字节,ASCII码就是一个字节,系统查完表得到了结果自然输出了
作者: 马上都有    时间: 2014-4-15 16:02
呆呆沙师妹 发表于 2014-4-14 19:22
Java采用的是Unicode编码,即16进制编码,故一个字符实际占两个字节。
但FileInputStream类中read()方法 ...

那一个字符占两个字节,用字节流读取两次才读完,每次都提升为一个字符,那最后不是变成了两个字符?
作者: 呆呆沙师妹    时间: 2014-4-15 16:52
马上都有 发表于 2014-4-15 16:02
那一个字符占两个字节,用字节流读取两次才读完,每次都提升为一个字符,那最后不是变成了两个字符? ...

是的,一个字节流一次只能读取一个字节数据,如果一个字符占了两个字节,字节流会将一个字符数据变为两个字节值进行输出。
我之前回答有些问题,你程序中是从硬盘文件中读取数据,最终输出结果与该文件中字符的编码方式有关。
比如:同样是abcd这四个字符,在我电脑上采用默认编码存储文件大小为四个字节,最终字节流读出的是4个字节值;采用Unicode编码,存储文件大小为10个字节,最终输出是10个字节。。。
你可以将你程序修改为循环读取,然后使用内容相同不同编码文件查看输出结果。
  1. import java.io.*;
  2. class aa
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 FileInputStream fis = new FileInputStream("aa.java");
  7.                 int len = 0;
  8.                 while( -1 != ( len = fis.read() ) ){
  9.                         System.out.println(len);
  10.                 }
  11.         }
  12. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2