摘要:作業系統就是管家,電腦的裝置就是資源,如果程序先要操作資源,必須要進行系統調用,有作業系統去處理,然後再傳回給程序,這樣的代理模式是不是很常見?是以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 三個關鍵詞記住
點選關注,第一時間了解華為雲新鮮技術~