java 關於fileinputstream的使用

DfromY發表於2020-11-10

今天瞭解了一下fileinputstream的使用,關於其read方法的使用

1、如何使用fileinputstream讀取檔案中的內容,首先通過閱讀原始碼來了解一下其原理

   /**
     * Reads a byte of data from this input stream. This method blocks
     * if no input is yet available.
     *
     * @return     the next byte of data, or <code>-1</code> if the end of the
     *             file is reached.
     * @exception  IOException  if an I/O error occurs.
     * @Range(from=-1,to=255)
     */
    public int read() throws IOException {
        return read0();
    }

Range(from=-1,to=255)
這是read()方法的說明,其讀取的其實就是按照ACSII碼來讀取的,超出的部分就會顯示亂碼。並且返回值為資料的ACSII碼,例如
pj.txt中

hello world
你好世界

import java.io.*;
import java.util.ArrayList;

public class E1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hasee\\Desktop\\pj.txt");
        int temp;
        while((temp=fileInputStream.read())!=-1)
        System.out.print((char)temp);
    }
}

結果為

hello world
ä½ å¥½ä¸–ç•Œ

所以我們讀取包括在ASCII中的資料的時候才使用這個方法,不然就選擇fileinputstream中的read(byte[])方法。
原始碼如下

    /**
     * Reads up to <code>b.length</code> bytes of data from this input
     * stream into an array of bytes. This method blocks until some input
     * is available.
     *
     * @param      b   the buffer into which the data is read.
     * @return     the total number of bytes read into the buffer, or
     *             <code>-1</code> if there is no more data because the end of
     *             the file has been reached.
     * @exception  IOException  if an I/O error occurs.
     * @Range(from=-1,to=java.lang.integer.MAX_VALUE)
     */
    public int read(byte b[]) throws IOException {
        return readBytes(b, 0, b.length);
    }

由此可知,這個方法是把讀取到的資料存在byte[]陣列當中,並返回讀取到的資料的長度,並且其資料範圍
Range(from=-1,to=java.lang.integer.MAX_VALUE)
可以讀取的範圍更大。
同樣使用pj.txt測試

import java.io.*;
import java.util.ArrayList;

public class E1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hasee\\Desktop\\pj.txt");
        byte[] bytes=new byte[1024];
        while (fileInputStream.read(bytes)!=-1){
            System.out.print(new String(bytes));
        }

    }
}

結果為

hello world
你好世界                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

注意:問題在今天使用read方法的時候出現,程式碼如下
import java.io.*;
import java.util.ArrayList;

public class E1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream=new FileInputStream("C:\\Users\\hasee\\Desktop\\pj.txt");

        while (fileInputStream.read()!=-1){
            System.out.print((char)fileInputStream.read());
        }

    }
}

測試檔案中內容為
“123456”
執行結果如下

246

我一開始很疑惑,為什麼總是缺少135,後面瞭解到,read方法其實可以理解為一個指標,當他第一次呼叫時候就會指向第一個資料,而後每一次呼叫都會使得指標往後移動一位,而我的程式碼中使用了read()方法在while中進行了判斷,然後又進行了輸出,導致判斷的那一次指向的資料就沒有被輸出,所就會產生這種情況。

相關文章