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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章