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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张旭明 中级黑马   /  2012-8-29 18:33  /  2337 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public static void readFile_1()throws IOException
    {
        FileInputStream fis = new FileInputStream("fos.txt");
        int ch = 0;
        ch = fis.read();
        System.out.println((char)ch);
    }
今天看视频看到这很不理解,int型是占4个字节,通过fis.read()返回的int型数据,而在输出时却只打印了一个字母a(fos.txt文本里我存的是"abcde")。ch既然是int型的那应该对应两个字符啊,字母输出的结果应该ab啊。

接着这段代码也不理解
public static void readFile_3()throws IOException
    {
        FileInputStream fis = new FileInputStream("fos.txt");
        byte[] buf = new byte[fis.available()];
        fis.read(buf);
        System.out.println(new String(buf));
        fis.close();
    }
fis.available()返回的是5,和我文本里字符的数量是一样的,接着通过fis.read(buf)存进一个长度为5字节数组里,而5个字符怎么能存进去啊,字符是两个字节,字节数组一位才一个字节。求解惑。

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 程有愿 于 2012-8-29 20:11 编辑

对于你的第一个疑惑你可以查询API了解FileInputStream的read方法,是读取一个数据字节所以值读取a
另外这个的int的确是4个字节,但这里的read返回的原本就是int类型的数据,将他付给ch很正常,

byte[] buf = new byte[fis.available()];这里的fis.available所得到的值也就是文件里的字节的长度,再将数组的长度设置为这个值
可以节约内存 , fis.read(buf);再将文件无阻塞式的写入到数组中


63MI`857FR8SBY8[9RE%%MD.jpg (11.81 KB, 下载次数: 105)

63MI`857FR8SBY8[9RE%%MD.jpg

PCZ$4ZAQL%@}PBKWISSZ]A5.jpg (16.48 KB, 下载次数: 103)

PCZ$4ZAQL%@}PBKWISSZ]A5.jpg

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public static void readFile_1()throws IOException
    {
        FileInputStream fis = new FileInputStream("fos.txt");
        int ch = 0;
        ch = fis.read();    //这里read方法一次是读一个字节的,虽然int型数据是4个字节的,但这里是将fis.read()方法读到的一个字节赋值给ch,因此只改变了ch的第八位数据
System.out.println((char)ch);   //一个字母占一个字节,显然这里也只打印出一个字母
    }

public static void readFile_3()throws IOException
    {
        FileInputStream fis = new FileInputStream("fos.txt");
        byte[] buf = new byte[fis.available()];  //楼主文件里的数据应该都是字母,所以字符的数量和fis.available()返回值是一样的
fis.read(buf); //这里和前面是同样的道理,read方法将buf.length个字节的数据读入到buf数组中
System.out.println(new String(buf));  
fis.close();
    }

另外楼主弄错了一个地方,你这里用的都是字节流,而不是字符流,对文本文件的io操作建议使用字符流,如FileReader

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
周兴华 发表于 2012-8-29 19:34
public static void readFile_1()throws IOException
    {
        FileInputStream fis = new FileInputS ...

非常感谢,对于楼上说的“一个字母占一个字节”,我百度了一下汉字是占一个字符,字母和数字是占一个字节的,原来我以为字母也是占一个字符也就是两个字节。
   还有个问题想问下字符'a'是占几个字节,不是说char类型的都是占两个字节吗?
回复 使用道具 举报
java的字符类型 char 占用2个直接,因为他是Unicode编码
Java简单数据类型
简单类型 大小 范围/精度
float 4 字节 32位IEEE 754单精度
double 8 字节 64位IEEE 754双精度
yte 1字节 -128到127
hort 2 字节 -32,768到32,767
int 4 字节 -2,147,483,648到2,147,483,647
long 8 字节 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807
char 2 字节 整个Unicode字符集
oolean 1 位 True或者false
回复 使用道具 举报
楼主 这总结是否满意呢?你说的字符时占两个字节
回复 使用道具 举报
曹昌 发表于 2012-8-29 20:20
楼主 这总结是否满意呢?你说的字符时占两个字节

文本里的字母和数字为什么只占一个字节,他们不是char类型的吗
回复 使用道具 举报
黑马张旭明 发表于 2012-8-29 19:58
非常感谢,对于楼上说的“一个字母占一个字节”,我百度了一下汉字是占一个字符,字母和数字是占一个字节 ...

我想楼主是没有明白数据如何以二进制形式存在的,我打个比方吧,比如字母a,它的ASCII码是97,一个字节占8位,那么字母a的二进制表现形式为01100001。char类型的数据占两个字节,如果执行代码char ch='a';
将字母a赋值给了char类型的ch,那么ch的二进制表现形式为:00000000 01100001  ;在打开一个文本文件时,我们的计算机会先根据二进制的字节数据进行解码,然后再以字符的形式展现出来。
回复 使用道具 举报
周兴华 发表于 2012-8-29 20:56
我想楼主是没有明白数据如何以二进制形式存在的,我打个比方吧,比如字母a,它的ASCII码是97,一个字节占8 ...

非常感谢,已经懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马