帶你深入理解Java的IO到底是個啥
阿新 • • 發佈:2021-07-09
摘要:作業系統就是管家,電腦的裝置就是資源,如果程序先要操作資源,必須要進行系統呼叫,有作業系統去處理,然後再返回給程序,這樣的代理模式是不是很常見?因此app 就是你寫的程式,資源就是硬碟或者其他的裝置,io就是進行的系統呼叫。
本文分享自華為雲社群《驚呆了,原來JavaIO如此簡單》,原文作者:香菜聊遊戲。
作業系統就是管家,電腦的裝置就是資源,如果程序先要操作資源,必須要進行系統呼叫,有作業系統去處理,然後再返回給程序,這樣的代理模式是不是很常見?因此app 就是你寫的程式,資源就是硬碟或者其他的裝置,io就是進行的系統呼叫。
為了保證作業系統的穩定性和安全性,一個程序的地址空間劃分為使用者空間(User space)
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 三個關鍵詞記住