1. 程式人生 > 其它 >帶你深入理解Java的IO到底是個啥

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

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

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

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

為了保證作業系統的穩定性和安全性,一個程序的地址空間劃分為使用者空間(User space)

核心空間(Kernel space )。像我們平常執行的應用程式都是執行在使用者空間,只有核心空間才能進行系統態級別的資源有關的操作,比如如檔案管理、程序通訊、記憶體管理等等。也就是說,我們想要進行 IO 操作,一定是要依賴核心空間的能力。並且,使用者空間的程式不能直接訪問核心空間。當想要執行 IO 操作時,由於沒有執行這些操作的許可權,只能發起系統呼叫請求作業系統幫忙完成。因此,使用者程序想要執行 IO 操作的話,必須通過系統呼叫來間接訪問核心空間

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

類結構如下

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

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());
      }
  }
}

讓我們看下原始碼是啥情況:

總結:

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

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