參考筆記:【Java基礎-3】吃透Java IO:字節流、字符流、緩沖流_javaio-CSDN博客
目錄
1.IO流簡介
1.1 什么是IO流?
1.2?IO流的分類
1.3 字符流和字節流的其他區別
1.4?Java IO流體系圖?
2.字符編碼詳解
3.?Java的char類型與 Unicode、UTF-16 的聯系
4.節點流
4.1 字符輸入流/輸出流——FileReader/FileWriter
5.2 字節輸入流/輸出流——FileInputStream/FileOutputStream
5.處理流
1.IO流簡介
1.1 什么是IO流?
IO,即 Input 、?Output ,也就是輸入和輸出,指應用程序和外部設備之間的數據傳遞,常見的外部設備包括磁盤文件、管道、網絡連接
Java 中是通過流處理 IO 的,那么什么是流?
流(Stream),是一個抽象的概念,是指一連串的數據(字符或字節),是以先進先出的方式發送信息的通道
當 Java 程序需要讀取數據的時候,就會開啟一個通向數據源的流,這個數據源可以是磁盤文件、內存、網絡連接等等。類似地,當 Java 程序需要寫入數據的時候,就會開啟一個通向目的地的流。這時候你就可以想象數據好像在這其中 "流"動 一樣
一般來說關于流的特性有下面幾點:
① 先進先出:最先寫入的數據會被最先讀出
② 順序存取:可以一個接一個地往流中寫入一串字節,讀出時也將按寫入順序讀取一串字節,不能隨機訪問中間的數據
③ 只讀或只寫:每個流只能是輸入流或輸出流的一種,不能同時具備兩個功能,輸入流只能進行讀操作,輸出流只能進行寫操作。在一個數據傳輸通道中,如果既要寫入數據,又要讀取數據,則要分別提供兩個流
1.2?IO流的分類
-
按數據的流向分類:輸入流和輸出流
-
輸入流 :讀取外部數據(磁盤、光盤等存儲設備的數據)到 Java 程序(內存)中;輸入流以 InputStream、Reader 結尾
-
輸出流 :將 Java 程序(內存)數據輸出到磁盤、光盤等存儲設備中;輸出流以 OutputStream、Writer 結尾
-
-
按數據的操作單位分類:字節流和字符流
-
字節流 :以數據單位為 8 位的字節為單位;字節流以 InputStream、OutputStream?結尾
-
字符流 :以數據單元為 16 位的字符為單位;字符流以 Reader、Writer 結尾
-
-
按流的功能分類:節點流和處理流
-
節點流:直接操作數據讀寫的流類,比如?FileInputStream
-
處理流:也稱為包裝流,用來包裝節點流,給節點流提供更加強大的讀寫功能
-
1.3 字符流和字節流的其他區別
除了操作的數據單位的區別,還有以下區別:
-
操作的文件類型不同:
-
字符流 :字符流用于處理純文本類型文件,如 .txt、.cpp、.txt、.java、.c、.cpp、.py 等,不能處理圖像、視頻等非文本文件
-
字節流 :字節流可以操作一切類型文件,但通常用來用來處理 .img、.mp3、.mp4、.ppt、.doc 等二進制文件
-
-
緩沖區:
-
字符流:字符輸出流本身帶有緩沖區(字符輸入流好像沒有),緩沖區是一個長度為 1024 的 char 類型數組
-
字節流:沒有緩沖區
-
驗證:字符輸出流帶有緩沖區
查看所有字符輸出流的基類?Writer?,如下:
?可以看到,字符輸出流自帶的緩沖區確實是一個長度為?1024?的?char?類型數組?writeBuffer?
1.4?Java IO流體系圖?
為了更好的閱讀體驗,建議大家對字符編碼、Java 的 char 類型有比較深的了解
2.字符編碼詳解
? ? ? ? 鏈接如下:
【字符編碼】詳解ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、UTF-32_gbk解碼-CSDN博客文章瀏覽閱讀966次,點贊27次,收藏22次。相信大家都遇到過打開一個文本文件然后出現亂碼的情況,經典的"錕斤拷"亂碼(bushi),如下:沒在深夜見過"錕斤拷"的人,不足以語人生...好了回歸正題,亂碼到底是怎么來的呢?知名亂碼"錕斤拷"又為何如此常見?不著急,要理解亂碼,首先需要知道計算是如何存儲為文字的:學過計算機的都知道,計算機只能存儲0、1這兩個二進制數,無論是文本文件里的數字、字母、漢字標點符號控制字符emoji😈👴等都需要用某種方式轉換成二進制數字進行存儲,需要的時候再讀出來。_gbk解碼
https://blog.csdn.net/m0_55908255/article/details/147335974?spm=1011.2415.3001.5331????????字符編碼主要內容包括 :?
? ? ? ? ① 字符集、編碼編碼介紹
? ? ? ? ② ASCII字符集 + 編碼
? ? ? ? ③ GB2312字符集 + 編碼
? ? ? ? ④ GBK 字符集 + 編碼
? ? ? ? ⑤ Unicode 字符集
? ? ? ? ⑥ Unicode 字符集的三種編碼方案:UTF-32、UTF-16、UTF-8
? ? ? ? ⑦ 亂碼的本質原因
3.?Java的char類型與 Unicode、UTF-16 的聯系
?? ? ? ? 鏈接如下:
【字符編碼】Java的char類型與Unicode、UTF-16的聯系-CSDN博客文章瀏覽閱讀921次,點贊16次,收藏24次。本文是上一篇博文的續篇:https://blog.csdn.net/m0_55908255/article/details/147335974?sharetype=blogdetail&sharerId=147335974&sharerefer=PC&sharesource=m0_55908255&spm=1011.2480.3001.8118https://blog.csdn.net/m0_55908255/article/details/147335974?sharetype=blogdetail&sh
https://blog.csdn.net/m0_55908255/article/details/147430863?spm=1011.2415.3001.5331????????主要內容包括 :?
? ? ? ? ① Java 的 char 類型底層設計
? ? ? ? ② Java 中關于 Unicode 的常用 API
? ? ? ? ③ 編碼和解碼
? ? ? ? ④ 亂碼問題
4.節點流
4.1 字符輸入流/輸出流——FileReader/FileWriter
??? ? ? ? 鏈接如下:
【Java IO流】字符輸入流FileReader、字符輸出流FileWriter-CSDN博客本文講解的是兩個比較重要的節點流,也是兩個比較重要的字符流。即字符輸入流FileReader、字符輸出流FileWriterJava IO作用:將磁盤文本文件的數據讀取到Java程序(內存)中作用:將Java程序(內存)中的字符寫入到磁盤文件中。
https://blog.csdn.net/m0_55908255/article/details/147529309?sharetype=blogdetail&sharerId=147529309&sharerefer=PC&sharesource=m0_55908255&spm=1011.2480.3001.8118? ? ? ? 主要內容包括 :?
? ? ? ? ① FileReader 構造器、常用方法
? ? ? ? ② FileReader 讀取文件案例演示
? ? ? ? ③ FileWriter 構造器、常用方法
? ? ? ? ④ FileWriter 寫入文件案例演示
? ? ? ? ⑤ FileReader + FileWriter 拷貝文本文件
5.2 字節輸入流/輸出流——FileInputStream/FileOutputStream
???? ? ? ? 鏈接如下:
【Java IO流】字節輸入流FileInputStream、字節輸出流FileOutputStream-CSDN博客本文講解的是兩個比較重要的節點流,也是兩個比較重要的字節流。即字節輸入流、字節輸出流Java IO作用:從磁盤文件中讀取字節數據Java程序(內存)中作用:將字節數據 從Java程序(內存) 寫入到磁盤文件。
https://blog.csdn.net/m0_55908255/article/details/147540602?sharetype=blogdetail&sharerId=147540602&sharerefer=PC&sharesource=m0_55908255&spm=1011.2480.3001.8118????????主要內容包括 :?
? ? ? ? ① FileInputStream 構造器、常用方法
? ? ? ? ② FileInputStream 讀取文件案例演示
? ? ? ? ③ FileOutputStream 構造器、常用方法
? ? ? ? ④ FileOutputStream 寫入文件案例演示
? ? ? ? ⑤ FileReader + FileWriter 拷貝文件
5.處理流
此部分講解 3 個處理流:緩沖流、轉換流、序列化流,再加 標準輸入\輸出流
????? ? ? ? 鏈接如下:
【Java IO流】處理流之緩沖流、轉換流、序列化流、標準輸入\輸出流-CSDN博客文章瀏覽閱讀75次。本文講解的是3個處理流 + 標準輸入\輸出流,內容比較枯燥緩沖字節流:緩沖字符流:BufferedReader、BufferedWriterJava IO節點流可以從一個特定的數據源讀數據或寫數據,比如節點流可以從文件讀取數據到Java程序中,節點流可以將Java程序中的數據寫入文件,這兩個結點流的數據源都是磁盤文件,如下所示:那處理流是什么東西呢?處理流也叫包裝流,是連接(包裝)在節點流之上的流,為節點流提供更為強大的讀寫功能上圖中很形象地描繪了節點流和處理流的關系。
https://blog.csdn.net/m0_55908255/article/details/147543826?spm=1011.2415.3001.5331? ? ? ? 主要內容包括 :?
? ? ? ? ① 緩沖字節流 BufferedInputStram、BufferedOutputStream 的原理、使用案例、與普通字節流的效率對比
? ? ? ? ② 緩沖字符流?BufferedReader、BufferedWriter 的原理、使用案例、與普通字符流的效率對比
? ? ? ? ③ 轉換流 InputStreamReader、OutputStreamWriter 的引入、作用、使用案例
? ? ? ? ④ 序列化流?ObjectInputStream、ObjectOutputStream 的原理、作用、使用案例
? ? ? ? ⑤ 標準輸入\輸出流 System.in 、System.out