首頁 > 軟體

《保姆系列五》原來JavaIO如此簡單,驚呆了

2021-05-21 09:30:16

前言:

群裡有大佬說想讓我寫一篇NIO,一直也沒寫,但是和同事聊天也說對Java的IO不是很清晰,因此今天就寫下Java的IO,先打個基礎,下次寫NIO,我們開始吧

一、IO底層是怎麼回事?

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

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

二、梳理類的結構

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

類結構如下

在平常的讀寫檔案的時候可以先用基本流,然後看是否需要字元流,最後在用上帶buffer 的流。

IO流的設計思想就是裝飾器模式,一層一層的進行升級功能。

三、IO類大點兵

四、來波例項展示

1、訪問操作檔案(FileInputStream/FileReader ,FileOutputStream/FileWriter)

importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;/*** 拷貝檔案* @author 香菜*/publicclassCopyFileWithStream {publicstaticvoidmain(String[] args) {intb=0;StringinFilePath="D:\wechat\A.txt";StringoutFilePath="D:\wechat\B.txt";try (FileInputStreamin=newFileInputStream(inFilePath); FileOutputStreamout=newFileOutputStream(outFilePath)) {while ((b=in.read()) !=-1) {out.write(b);} } catch (IOExceptione) {e.printStackTrace(); }System.out.println("檔案複製完成"); }}

2、快取流的使用(BufferedInputStream/BufferedOutputStream,BufferedReader/BufferedWriter)

packageorg.pdool.iodoc;importjava.io.*;/*** 拷貝檔案** @author 香菜*/publicclassCopyFileWithBuffer {publicstaticvoidmain(String[] args) throwsException {StringinFilePath="D:\wechat\A.txt";StringoutFilePath="D:\wechat\B.txt";try (BufferedInputStreambis=newBufferedInputStream(newFileInputStream(inFilePath));BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(outFilePath))) {byte[] b=newbyte[1024];intoff=0;while ((off=bis.read(b)) >0) {bos.write(b, 0, off); } } }}

3、獲取鍵盤輸入

importjava.util.Scanner;publicclassTestScanner {publicstaticvoidmain(String[] args) {Scannerscanner=newScanner(System.in);while (scanner.hasNextLine()){System.out.println(scanner.nextLine());} }}

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

總結:

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


IT145.com E-mail:sddin#qq.com