A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.io.*;
class aa
{
        public static void main(String[] args) throws IOException
        {
                FileInputStream fis = new FileInputStream("aa.java");
                System.out.println(fis.read());
        }
}

评分

参与人数 1黑马币 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

13 个回复

倒序浏览
read()方法返回的就是读取的当前字符对应的ASCII码
你用System.out.println( (char)fis.read() );  就可以得到读入的字符了
回复 使用道具 举报
字符流和字节流区别在于,字符流比字节流多了查编码表动作。
你使用字节流读取,略去了查表功能,得到的结果就是未查表的数值结果。
回复 使用道具 举报
查了下手册:
  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;
复制代码
回复 使用道具 举报
ASCII码就是老美用的编码,只有一个字节的后七位,read方法读到一个字节,也就是八位,当然读到的就是ASCII值了
回复 使用道具 举报
javaApi写的很清楚啊,用stream输入,当然是字节啦,一字节,当然是ascII码啦
回复 使用道具 举报
zhangbingyuan 发表于 2014-4-13 23:59
read()方法返回的就是读取的当前字符对应的ASCII码
你用System.out.println( (char)fis.read() );  就可以 ...

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

我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗?而我才读一个字节,怎么输出两个是占字节的一个字符?
回复 使用道具 举报

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

我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗?而我才读一个字节,怎么输出两个是占字节的一个字符?而你这样说,读取一个字节的后8位,那怎么会输出的是点两个字节的一个字符呢?
回复 使用道具 举报
马上都有 发表于 2014-4-14 14:27
我的意思是,用字节流读取的是一个字节,而输出的却是一个字符对应的ASCII值,一字符不是占两个字节吗? ...

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

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

那一个字符占两个字节,用字节流读取两次才读完,每次都提升为一个字符,那最后不是变成了两个字符?
回复 使用道具 举报
马上都有 发表于 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. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马