天天看點

位元組流_FileInputStream類讀取

File類:用于描述一個檔案或者檔案夾的。

通過File對象我們可以讀取檔案或者檔案夾的屬性資料,如果我們需要讀取檔案的内容資料,那麼我們需要使用IO流數技術。

IO流(Input Output)

IO技術主要的作用是用于解決裝置與裝置之間的資料傳輸問題。比如:硬碟-->記憶體          記憶體的資料-->硬碟上         把鍵盤的資料-->記憶體中

IO流分類:

    如果我們按照資料的流向劃分:

        輸入流:

        輸出流:

    如果按照處理的機關劃分:

        位元組流:位元組流讀取的都是檔案中的二進制資料,讀取到的二進制資料不會經過任何的處理。

        字元流:字元流讀取的資料是以字元為機關的。字元流也是讀取檔案中的二進制資料,不過會把這些二進制資料轉換成我們能識别的字元。

            字元流 = 位元組流 + 解碼

判斷使用輸入流還是輸出流的依據:    

    以目前程式作為參照物,觀察資料是流入還是流出,如果流出則使用輸出流,如果流入則使用輸入流。

輸入位元組流:

-------------| InputStream 此抽象類是表示位元組輸入流的所有類的超類。 

------------------| FileInputStream 從檔案系統中的某個檔案中獲得輸入位元組。

使用FileInputStream讀取檔案資料的步驟:

    1.找到目标檔案

    2.建立資料的輸入通道

    3.讀取檔案中的資料

    4.關閉資源,實際上就是釋放資源

推薦使用方式4讀取:

使用緩沖數組 + 循環 配合讀取。

注意事項:

    1.資源檔案一旦使用完畢,應該立即釋放資源檔案

    2.讀取檔案時,循環讀取時,緩沖數組每次都是覆寫,并不是先清空再讀取。是以應該采用new String(buff, 0, length)方法而不是new String(buff)  

package com.cn.input;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年7月24日16:49:24
* Desc:
File類:用于描述一個檔案或者檔案夾的。
通過File對象我們可以讀取檔案或者檔案夾的屬性資料,如果我們需要讀取檔案的内容資料,那麼我們需要使用IO流數技術。
IO流(Input Output)
IO技術主要的作用是用于解決裝置與裝置之間的資料傳輸問題。比如:硬碟-->記憶體          記憶體的資料-->硬碟上         把鍵盤的資料-->記憶體中
IO流分類:
  如果我們按照資料的流向劃分:
    輸入流:
    
    輸出流:
  如果按照處理的機關劃分:
    位元組流:位元組流讀取的都是檔案中的二進制資料,讀取到的二進制資料不會經過任何的處理。
    
    字元流:字元流讀取的資料是以字元為機關的。字元流也是讀取檔案中的二進制資料,不過會把這些二進制資料轉換成我們能識别的字元。
      字元流 = 位元組流 + 解碼
    
判斷使用輸入流還是輸出流的依據:  
  以目前程式作為參照物,觀察資料是流入還是流出,如果流出則使用輸出流,如果流入則使用輸入流。
輸入位元組流:
-------------| InputStream 此抽象類是表示位元組輸入流的所有類的超類。 
------------------| FileInputStream 從檔案系統中的某個檔案中獲得輸入位元組。
使用FileInputStream讀取檔案資料的步驟:
  1.找到目标檔案
  2.建立資料的輸入通道
  3.讀取檔案中的資料
  4.關閉資源,實際上就是釋放資源
推薦使用方式4讀取:使用緩沖數組 + 循環 配合讀取。
*/
public class Demo1 {
  public static void main(String[] args) throws IOException {
//    readTest1();
//    readTest2();
//    readTest3();
    readTest4();
  }
  
  //方式1:一次讀一個位元組
  public static void readTest1() throws IOException{
    //1.找到目标檔案
    File file = new File("f:/a.txt");
    //2.建立資料的輸入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //3.讀取檔案中的資料
    int i = fileInputStream.read();
    System.out.println((char)i);
    //4.關閉資源,實際上就是釋放資源
    fileInputStream.close();
  }
  
  //不使用緩沖數組,一次一個位元組循環讀取
  public static void readTest2() throws IOException{
    long startTime = System.currentTimeMillis();
    //1.找到目标檔案
//    File file = new File("f:/a.txt");
    File file = new File("f:/cool.png");
    //2.建立資料的輸入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //3.讀取檔案的資料
    int content = 0;
    while((content = fileInputStream.read()) != -1){
      System.out.print((char)content);
    }
    //4.關閉資源,實際上就是釋放資源
    fileInputStream.close();
    long stopTime = System.currentTimeMillis();
    
    System.out.println("方式2讀取總共耗時:" + (stopTime-startTime) + "ms"); //480毫秒
  }
  
  //方式3:使用緩沖數組讀取。 缺點:無法讀取完整一個檔案的資料。 緩沖不能太大,因為假如讀取12G電影,得配置設定很多記憶體,不可行。
  public static void readTest3() throws IOException{
    //1.找到目标檔案
    File file = new File("f:/a.txt");
    //2.建立資料的輸入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //3.讀取檔案的資料
//    Long l = file.length();
//    byte[] buff = new byte[l.intValue()];//緩沖不能太大,因為假如讀取12G電影,得配置設定很多記憶體,不可行。
    byte[] buff = new byte[40];//相當于超市裡面的購物車,從此輸入流中将最多 buff.length 個位元組的資料讀入一個 byte 數組中
    int length = fileInputStream.read(buff);//如果使用read讀取資料傳入位元組數組,那麼資料是存儲到位元組數組中的,而這時候read()方法的傳回值是本次讀取了幾個位元組資料到位元組數組byte[]中
    System.out.println(new String(buff) + "前面有空白");
    System.out.println(new String(buff, 0, length) + "前面沒有空白");
    //4.關閉資源,實際上就是釋放資源
    fileInputStream.close();
  }
  
  //方式4:使用緩沖數組 + 循環 配合讀取。
  public static void readTest4() throws IOException{
//    //1.找到目标檔案
//    File file = new File("f:/a.txt");
    long startTime = System.currentTimeMillis();
    //1.找到目标檔案
//    File file = new File("f:/a.txt");
    File file = new File("f:/cool.png");
    //2.建立資料的輸入通道
    FileInputStream fileInputStream = new FileInputStream(file);
    //3.建立緩沖數組配合循環讀取檔案的資料
    byte[] buff = new byte[1024];//用來存儲每次讀取到的資料,緩沖數組的長度一般是1024的倍數,因為與計算機的處理機關有關。理論上緩沖數組越大效率越高。
    int length = 0;//儲存每次都去到的位元組個數。
    int count = 1;//讀取的次數
    while((length = fileInputStream.read(buff)) != -1){//讀入緩沖區的位元組總數,如果因為已經到達檔案末尾而沒有更多的資料,則傳回 -1。 
      System.out.print("讀的第" + count++ + "次:" + new String(buff, 0, length));
    }
    //4.關閉資源,實際上就是釋放資源
    fileInputStream.close();
    
    long stopTime = System.currentTimeMillis();
    
    System.out.println("方式4讀取總共耗時:" + (stopTime-startTime) + "ms");  //32ms
  }
}
      

FileInputStream讀取時要注意的細節: