天天看點

帶你深入了解Java的IO到底是個啥

摘要:作業系統就是管家,電腦的裝置就是資源,如果程序先要操作資源,必須要進行系統調用,有作業系統去處理,然後再傳回給程序,這樣的代理模式是不是很常見?是以app 就是你寫的程式,資源就是硬碟或者其他的裝置,io就是進行的系統調用。

本文分享自華為雲社群《驚呆了,原來JavaIO如此簡單》,原文作者:香菜聊遊戲。

作業系統就是管家,電腦的裝置就是資源,如果程序先要操作資源,必須要進行系統調用,有作業系統去處理,然後再傳回給程序,這樣的代理模式是不是很常見?是以app 就是你寫的程式,資源就是硬碟或者其他的裝置,io就是進行的系統調用。

帶你深入了解Java的IO到底是個啥

為了保證作業系統的穩定性和安全性,一個程序的位址空間劃分為 使用者空間(User space) 和 核心空間(Kernel space ) 。像我們平常運作的應用程式都是運作在使用者空間,隻有核心空間才能進行系統态級别的資源有關的操作,比如如檔案管理、程序通信、記憶體管理等等。也就是說,我們想要進行 IO 操作,一定是要依賴核心空間的能力。并且,使用者空間的程式不能直接通路核心空間。當想要執行 IO 操作時,由于沒有執行這些操作的權限,隻能發起系統調用請求作業系統幫忙完成。是以,使用者程序想要執行 IO 操作的話,必須通過 系統調用 來間接通路核心空間

java的io 實在太複雜了,往往新手很難掌握,因為隻緣身在此山中,新手往往很難從全體去看到問題的本質,我和打鐵的朋友的聊天截圖能幫你解答一些。

帶你深入了解Java的IO到底是個啥

類結構如下

帶你深入了解Java的IO到底是個啥

在平常的讀寫檔案的時候可以先用基本流,然後看是否需要字元流,最後在用上帶buffer 的流。IO流的設計思想就是裝飾器模式,一層一層的進行更新功能。

IO類大點兵

帶你深入了解Java的IO到底是個啥

來波執行個體展示

1、通路操作檔案(FileInputStream/FileReader ,FileOutputStream/FileWriter)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
* 拷貝檔案
* @author 香菜
*/
public class CopyFileWithStream {
   public static void main(String[] args) {
       int b = 0;
       String inFilePath = "D:\\wechat\\A.txt";
       String outFilePath = "D:\\wechat\\B.txt";
       try (FileInputStream in = new FileInputStream(inFilePath); FileOutputStream out = new FileOutputStream(outFilePath)) {
           while ((b = in.read()) != -1) {
               out.write(b);
          }
      } catch (IOException e) {
           e.printStackTrace();
      }
       System.out.println("檔案複制完成");
  }
}      

2、緩存流的使用(BufferedInputStream/BufferedOutputStream,BufferedReader/BufferedWriter)

package org.pdool.iodoc;

import java.io.*;

/**
* 拷貝檔案
*
* @author 香菜
*/
public class CopyFileWithBuffer {
   public static void main(String[] args) throws Exception {
       String inFilePath = "D:\\wechat\\A.txt";
       String outFilePath = "D:\\wechat\\B.txt";
       try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFilePath));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFilePath))) {
           byte[] b = new byte[1024];
           int off = 0;
           while ((off = bis.read(b)) > 0) {
               bos.write(b, 0, off);
          }
      }
  }
}      

3、擷取鍵盤輸入

import java.util.Scanner;

public class TestScanner {
   public static void main(String[] args) {
       Scanner scanner = new Scanner(System.in);
       while (scanner.hasNextLine()){
           System.out.println(scanner.nextLine());
      }
  }
}      

讓我們看下源碼是啥情況:

帶你深入了解Java的IO到底是個啥

總結:

  • 而Reader/Writer則是用于操作字元,增加了字元編解碼等功能,适用于類似從檔案中讀取或者寫入文本資訊。本質上計算機操作的都是位元組,不管是網絡通信還是檔案讀取,Reader/Writer相當于建構了應用邏輯和原始資料之間的橋梁。
  • Buffered等帶緩沖區的實作,可以避免頻繁的磁盤讀寫,進而提高IO處理效率。
  • 記住IO流的設計模式是裝飾器模式,對流進行功能更新。
  • stream,reader ,buffered 三個關鍵詞記住

點選關注,第一時間了解華為雲新鮮技術~