JAVA IO中read()方法的返回值

以下是不太严谨的个人理解,有错误欢迎指出,共同进步:

read()方法的作用是从输入流读取数据的下一个字节,返回的字节的值是一个0~255之间的整数。到达流的末尾返回-1。

刚开始我以为这个返回值表示的是所读取的数据的长度,可是之后在一个示例程序中发现这种说法解释不通。我就好奇研究了一下这个返回值到底表示什么。

首先要知道什么是字节(Byte)和比特(bit),它们都是计算机信息量的度量单位。
每一个二进制位(bit)有0和1两种状态,八个二进制位(bit)被称为一个字节(Byte),一个字节可以表示出2^8=256种状态,从0000 0000到1111 1111。每个状态可以对应一个符号。
1 Byte=8 bits


那么来看两个例子:
假如一个文本文件test.txt的内容是“12345”(这里不讨论汉字),它的编码方式是ASCII,那么它的一个字符占一个字节,使用read()读取到的第一个字节是‘1’,‘1’是以它的统一码0x0031存在于文件中的,即 read()读取到的不是0000 0001而是它的统一码0011 0001 ,而read()的返回值是int类型,就是将0011 0001(B)转化为(int)49后返回。你看到的返回值就是49啦。

import java.io.*;

public class Test {
    public static void main(String[] args) {
        try {
            FileOutputStream output = new FileOutputStream("test.txt");

            //打开文本文档test.txt看到的是12345
            output.write('\u0030');
            output.write('\u0031');
            output.write('\u0032');
            output.write('\u0033');
            output.write('\u0034');

            BufferedInputStream input = new BufferedInputStream(new FileInputStream("test.txt"));

            int i;
            while ((i = input.read()) != -1) {
                System.out.println(i);
            }
        } catch (IOException ex) {
            System.out.println(ex.getStackTrace());
        }
    }
}

输出结果是
49
50
51
52
53

有一个二进制文件test.dat的内容是“12345”,二进制文件不需要编码转换,使用二进制I/O向文件写入一个数值,你写什么就在文件中保存了什么,即read()读取到的第一个字节是‘1’,就是0000 0001,返回值是(int)1;read()读取的第二个字节是‘2’,就是0000 0010,返回值是(int)2。

import java.io.*;

public class Test {
    public static void main(String[] args) {
        try {
            FileOutputStream output = new FileOutputStream("test.dat");

            output.write((byte)1);
            output.write((byte)2);
            output.write((byte)3);
            output.write((byte)4);
            output.write((byte)5);

            BufferedInputStream input = new BufferedInputStream(new FileInputStream("test.dat"));

            int i;
            while ((i = input.read()) != -1) {
                System.out.println(i);
            }
        } catch (IOException ex) {
            System.out.println(ex.getStackTrace());
        }
    }
}

输出结果是
1
2
3
4
5

总个结:
read()方法返回非-1的返回值只是表示后面还有数据,而不是表示读取了多少个数据,并且因为编码方式的差异,想通过返回值知道所读取的数据是什么,是有难度的。

参考1:http://blog.sina.com.cn/s/blog_9e351f9b01015kgp.html
参考2:http://blog.sina.com.cn/s/blog_7191ed320101178a.html

关于编码方式和统一码的定义,可以看看这个http://blog.csdn.net/csywwx2008/article/details/17137097

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值