1. 程式人生 > 實用技巧 >FileInputStream輸入位元組流

FileInputStream輸入位元組流

java.io.FileInputStream 1 檔案位元組輸入流,萬能的,任何型別的檔案都可以採用這個流來讀。 2 位元組的方式,完成輸入的操作,完成讀的操作(是從硬碟到記憶體的一個過程。) FileInputStream流案例1:
package com.javaSe.FileInputStream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


/*
java.io.FileInputStream
    1 檔案位元組輸入流,萬能的,任何型別的檔案都可以採用這個流來讀。
    2 位元組的方式,完成輸入的操作,完成讀的操作(是從硬碟到記憶體的一個過程。)
*/
public class FileInputStreamTest01 {
    public static
void main(String[] args) { FileInputStream fis = null; try { // 建立檔案位元組輸入流物件 // 檔案路徑:C:\Users\xlWu\Desktop\學習\IO流(IDEA會自動把\變成\\表示轉義) // 以下都是採用了:絕對路徑的方式。 // FileInputStream fileInputStream = new FileInputStream("C:\Users\xlWu\Desktop\學習\IO流\temp.txt");
// 寫成這個/也是可以的。 fis = new FileInputStream("C:/Users/xlWu/Desktop/學習/IO流/temp.txt"); // 開始讀 int readDate = fis.read();// 這個方法返回到的是:讀取到的“位元組”本身。 System.out.println(readDate);// 97 readDate = fis.read(); System.out.println(readDate);
// 98 readDate = fis.read(); System.out.println(readDate);// 99 readDate = fis.read(); System.out.println(readDate);// 68 readDate = fis.read(); System.out.println(readDate);// 69 readDate = fis.read(); System.out.println(readDate);// 70 // 已經讀到檔案的末尾了,在讀的時候讀取不到任何資料,返回-1 readDate = fis.read(); System.out.println(readDate);// -1 readDate = fis.read(); System.out.println(readDate);// -1 readDate = fis.read(); System.out.println(readDate);// -1 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 在finally語句塊當中確保流一定是關閉的。 if (fis != null) {// 避免空指標異常。 // 關閉留的前提是:流不是空,流是null的時候沒必要關閉。 try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }

FileInputStream流案例2:

package com.javaSe.FileInputStream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class FileInputStreamTest02 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("C:\\Users\\xlWu\\Desktop\\學習\\IO流\\temp.txt");
            
            /*while (true){
                int readDate = fis.read();
                if (readDate == -1) {
                    break;
                }
                System.out.println(readDate);
            }*/
            
            // 改造while迴圈
            int readDate = 0;
            while ((readDate = fis.read()) != -1){
                System.out.println(readDate);
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileInputStream案例3:

package com.javaSe.FileInputStream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


/*
int read(byte[] b)
    一次最多讀取b.length 個位元組。
    減少硬碟和記憶體的互動,提高程式執行效率。
    往byte[]陣列當中讀。
*/
public class FileInputStreamTest03 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            // 相對路徑的話呢?相對路徑一定是從當前所在的位置作為起點開始找!
            // IDEA預設當前路徑是哪裡?工程Project的根就是IDEA的預設當前路徑。
            // fis = new FileInputStream("tempFile2");
            // fis = new FileInputStream("Stream/tempFile2");
            // fis = new FileInputStream("Stream/src//tempFile3");
            fis = new FileInputStream("Stream\\src\\com\\javaSe\\FileInputStream\\tempFile4");
            
            // 開始讀,採用byte陣列,一次讀取多個位元組。最多讀取 陣列.length 個位元組
            byte[] bytes = new byte[4];// 準備一個4個長度的byte陣列,一次最多讀取4個位元組。
            // 這個方法的返回值是:讀取到的位元組數量。(不是位元組本身)
            int readCount = fis.read(bytes);
            System.out.println(readCount);// 第一次讀到了4個位元組。
            // 將位元組陣列全部轉換成字串
            // System.out.println(new String(bytes)); // abcd
            // 不應該全部都轉換,應該是讀取了多少個位元組,轉換多少個。
            System.out.println(new String(bytes,0,readCount));
    
            readCount = fis.read(bytes);// 第二次只能讀取到2個位元組。
            System.out.println(readCount); // 2
            // 將位元組陣列全部轉換成字串
            // System.out.println(new String(bytes)); // efcd
            // 不應該全部都轉換,應該是讀取了多少個位元組,轉換多少個。
            System.out.println(new String(bytes,0,readCount));
    
            readCount = fis.read(bytes);// 1個位元組都沒有讀到
            System.out.println(readCount); // -1
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileInputStream案例4:

package com.javaSe.FileInputStream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


/*
最終版,需要掌握。
*/
public class FileInputStreamTest04 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("Stream\\src\\tempFile3");
            
            // 準備一個byte陣列
            byte[] bytes = new byte[4];
            /*while (true){
                int readCount = fis.read(bytes);
                if (readCount == -1){
                    break;
                }
                String s = new String(bytes,0,readCount);
                System.out.print(s);
            }*/
            int readCount = 0;
            while ((readCount = fis.read(bytes)) != -1){
                System.out.print(new String(bytes,0,readCount));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileInputStream案例5:

package com.javaSe.FileInputStream;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


/*
FileInputStream類的其他常用方法:
    int available():返回流當中剩餘的沒有讀到的位元組數量。
    long skip(long n):跳過幾個位元組不讀。
*/
public class FileInputStreamTest05 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("tempFile");
            System.out.println("總位元組數量 = " + fis.available());
            /*// 讀1個位元組
            // int readByte = fis.read();
            // 還剩下幾個位元組:5
            // System.out.println("還剩下多少個位元組沒有讀 = " + fis.available());
            // 這個方法有什麼用?
            byte[] bytes = new byte[fis.available()]; // 這種方式不太適合太大的檔案,因為byte[]陣列不能太大。
            // 不需要迴圈了。
            // 直接讀一次就行了。
            int readCount = fis.read(bytes);// 6
            System.out.println(new String(bytes));//abcdef*/
            
            // skip跳過幾個位元組不讀取,這個方法可能以後會用
            fis.skip(3);
            System.out.println(fis.read());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}