FileInputStream輸入位元組流
阿新 • • 發佈:2020-08-09
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 staticvoid 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(); } } } } }