深入java io底層(上)

2020-11-09 I沒有T

1.io流的概念

  • 把這些不同類型的輸入、輸出源抽象為流(Stream),其中輸入或輸出的數據稱為數據流(Data Stream),用統一的接口來表示;

2.io流的分類

  1. 按照流向分:
  • 輸入流:讀取外部數據(磁碟、光碟等存儲設備的數據)到程序(內存)中;
  • 輸出流:把程序(內存)中的內容輸出到磁碟、光碟等存儲設備中;

  1. 按照數據單位分(1字符 = 2位元組; 1位元組(byte) = 8位(bit); 一個漢字佔兩個字節長度):
  • 字節流:每次讀取(寫出)一個字節,當傳輸的資源文件有中文時,就會出現亂碼;
  • 字符流:每次讀取(寫出)兩個字節,有中文時,使用該流就可以正確傳輸顯示中文;

3.字節輸入流

  1. 常用數據操作方法
  • int read():從輸入流中讀取一個字節的二進位數據;
  • int read(byte[] b):將多個字節讀到數組中,填滿整個數組;
  • int read(byte[] b, int off, int len):從輸入流中讀取長度為 len 的數據,從數組 b 中下標為 off 的位置開始放置讀入的數據,讀完返回讀取的字節數;
  • void close():關閉數據流;
  • int available():返回目前可以從數據流中讀取的字節數(但實際的讀操作所讀得的字節數可能大於該返回值);
  • long skip(long l):跳過數據流中指定數量的字節不讀取,返回值表示實際跳過的字節數;
  1. IO 中輸入字節流的繼承
  • ByteArrayInputStream:字節數組輸入流,該類的功能就是從字節數組 byte[] 中進行以字節為單位的讀取,也就是將資源文件都以字節形式存入到該類中的字節數組中去,我們拿數據也是從這個字節數組中拿;
  • PipedInputStream:管道字節輸入流,它和 PipedOutputStream 一起使用,能實現多線程間的管道通信;
  • FilterInputStream:裝飾者模式中充當裝飾者的角色,具體的裝飾者都要繼承它,所以在該類的子類下都是用來裝飾別的流的,也就是處理類;
  • BufferedInputStream:緩衝流,對處理流進行裝飾、增強,內部會有一個緩衝區,用來存放字節,每次都是將緩衝區存滿然後發送,而不是一個字節或兩個字節這樣發送,效率更高;
  • DataInputStream:數據輸入流,用來裝飾其他輸入流,它允許通過數據流來讀寫Java基本類型;
  • FileInputStream:文件輸入流,通常用於對文件進行讀取操作;
  • File:對指定目錄的文件進行操作;
  • ObjectInputStream:對象輸入流,用來提供對「基本數據或對象」的持久存儲。通俗點講,就是能直接傳輸Java對象(序列化、反序列化用);

4.字節輸出流OutputStream

  1. 常用數據操作方法
  • void write(int i):將字節 i 寫入到數據流中,它只輸出所讀入參數的最低 8 位,該方法是抽象方法,需要在其輸出流子類中加以實現,然後才能使用;
  • void write(byte[] b):將數組 b 中的全部 b.length 個字節寫入數據流;
  • void write(byte[] b, int off, int len):將數組 b 中從下標 off 開始的 len 個字節寫入數據流。元素 b[off] 是此操作寫入的第一個字節,b[off + len - 1] 是此操作寫入的最後一個字節;
  • void close():關閉輸出流;
  • void flush():刷新此輸出流並強制寫出所有緩衝的輸出字節;
  1. IO 中輸出字節流的繼承

  1. 代碼案例

5.字符輸入流Reader

  1. 常用數據操作方法

  1. Reader及其一些常用子類的繼承圖:

  • CharReader和SringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據;
  • PipedReader 是從與其它線程共用的管道中讀取數據;
  • BufferedReader很明顯是一個裝飾器,它和其他子類負責裝飾其他Reader對象;
  • FilterReader是所有自定義具體裝飾流的父類,其子類PushBackReader對Reader對象進行裝飾,會增加一個行號;
  • InputStreamReader是其中最重要的一個,用來在字節輸入流和字符輸入流之間作為中介,可以將字節輸入流轉換為字符輸入流;
  • FileReader 可以說是一個達到此功能、常用的工具類,在其原始碼中明顯使用了將FileInputStream 轉變為Reader 的方法。

6.字符輸出流Writer

  1. 常用數據操作方法

  1. Writer及其一些常用子類的繼承圖

  • CharWriter、StringWriter 是兩種基本的介質流,它們分別向Char 數組、String 中寫入數據;
  • PipedWriter 是向與其它線程共用的管道中寫入數據。BufferedWriter 是一個裝飾器為Writer 提供緩衝功能;
  • PrintWriter 和PrintStream 極其類似,功能和使用也非常相似;
  • OutputStreamWriter是其中最重要的一個,用來在字節輸出流和字符輸出流之間作為中介,可以將字節輸出流轉換為字符輸出流;
  • FileWriter 可以說是一個達到此功能、常用的工具類,在其原始碼中明顯使用了將OutputStream轉變為Writer 的方法;
  1. 示例

7.字節流和字符流的區別

  • 字節流以字節為單位輸入輸出數據,按照8位傳輸;字符流以字符為單位輸入輸出數據,按照16位傳輸
  • 字節流在操作時本身不會用到緩衝區(內存),是文件本身直接操作的;而字符流在操作時使用了緩衝區,通過緩衝區再操作文件;

8.字節流與字符流的使用場景

  • 字節流一般用來處理圖像,視頻,以及PPT,Word類型的文件。字符流一般用於處理純文本類型的文件,如TXT文件等;
  • 字節流可以用來處理純文本文件,但是字符流不能用於處理圖像視頻等非文本類型的文件;

相關焦點

  • 深入java io底層(下)
    out是一個靜態PrintStream類型的成員變量,System是一個java.lang包中的類,用於和底層的作業系統進行交互;12.BIO、NIO、AIO實現詳述通俗描述:假設有這麼一個場景,有一排水壺(客戶)在燒水;AIO的做法是
  • java中的IO流(字符流和字節流)
    案例代碼:System.out.println(file.delete());void deleteOnExit()當調用deleteOnExit()方法時,只是相當於對deleteOnExit()作一個聲明,當程序運行結束,JVM終止時才真正調用deleteOnExit()方法實現刪除操作。
  • 深入學習JAVA-IO流詳解
    (一)IO流基本概念Java對數據的操作是通過流的方式,io是java中實現輸入輸出的基礎,它可以很方便的完成數據的輸入輸出操作,Java把不同的輸入輸出抽象為流,通過流的方式允許Java程序使用相同的方式來訪問不同的輸入、輸出。
  • 《深入理解Java虛擬機》:Java內存區域
    = Class #17 // java/lang/System #17 = Utf8 java/lang/System #18 = NameAndType #19:#20 // out:Ljava/io/PrintStream; #19 = Utf8 out
  • JAVA深入學習(棧和隊列)棧應用之單詞逆序
    nbsp;       }        return stackArray[top];    }} 逆序操作代碼:import java.io.BufferedReader
  • JAVA IO Stream流總結
    Java中I/O操作主要是指使用 java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫 出數據。一.java.io.File 類1.v File類關心的是在磁碟上文件的存儲.v File類描述的是一個文件或文件夾。(文件夾也可以稱為目錄)v 該類的出現是對文件系統的中的文件以及文件夾進行對象的封裝。可以通過對象的思想來操作文件以及文件夾。v 可以用面向對象的處理問題,通過該對象的方法,可以得到文件或文件夾的信息方便了對文件與文件夾的屬性信息進行操作。
  • java——io流總概述
    1.什麼是io流io流就是以流的方式進行數據的傳輸,流可以看作是數據內容的一個載體亦或者是一個數據傳輸的管道。2.io流的分類根據流向:輸入流:把外部數據輸入到程序中,類似於上傳。輸出流:把程序中的數據輸出到磁碟等外部的存儲空間上,類似於下載。
  • Java IO 以及 NIO 詳解
    、Writer)和字節流(InputStream、OutputStream)的使用。包下的知識點,但隨著 Java 的不斷發展,在 Java 1.4 時新的 IO 包出現了 java.nio,NIO(Non-Blocking IO)的出現解決了傳統 IO,也就是我們經常說的 BIO(Blocking IO)同步阻塞的問題,NIO 提供了 Channel、Selector 和 Buffer 等概念,可以實現多路復用和同步非阻塞 IO 操作,從而大大提升了 IO 操作的性能。
  • Java進階:遠程過程調用(RPC)及回調方法(二)
    回調方法在客戶端實例化一個遠程(Remote)對象,調用遠程方法時作為參數傳遞給服務端,服務端通過調用這個遠程對象的方法實現回調。import java.rmi.Remote;import java.rmi.RemoteException;public interface ICallback extends Remote { //供服務端調用,同樣code參數用於標識兩臺 void callback(int code) throws RemoteException;}同樣的 extends
  • IO,對象傳輸的基石(二)
    掃描流定義:與列印流對應,解釋了控制到輸入底層原理,本質上是java.util.Scanner類:掃描器類,表示輸入操作,且見代碼2。數據流可以讀寫任意類型的數據,8種基本類型(boolean char float double byte short int long),字符串(readChars、readUTF),數組(int數組、byte數組),程序(代碼1)為縮減程序,只寫了三種(byte char utf字符串)。
  • java.io.IOException: mark/reset not supported 異常
    在 Azure 上傳文件的時候遇到了一個下面的異常:java.io.IOException: mark/reset not supportedat java.base/java.io.InputStream.reset(InputStream.java:655)
  • Java中IO流的通俗講義
    以CPU為中心,從外部設備讀取數據到內存,進而再讀入到CPU,這是輸入(Input,縮寫I)過程;將內存中的數據寫入到外部設備,這是輸出(Output,縮寫O)過程。所以輸入輸出簡稱為I/O。 雖然JAVA中的IO流共涉及到了40多個類,但這些類都非常有規律,都是從四個抽象基類(上圖)派生的,由這四個類派生出來的子類名稱都是以其父類名作為子類名後綴。
  • 當年偶然發現的 Java Bug(JDK 9及之前仍未修復)
    Linux 也是偶發現象),新版本代碼並沒有生效(反編譯 class)。起初我是在本地 Windows 上跟蹤調試基於 Ant 插件的代碼,但始終重現不了(最後測試發現 Windows 無此 Bug)。
  • Java性能優化集錦(四)
    主要應用例如: RMI 要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。二: java 對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入字節流中,可以保存在文件中或在網絡連接上傳遞。利用對象序列化可以進行對象的 &34; ,即複製對象本身及引用的對象本身。
  • 請收藏這份Java面試必考題(上)
    () 獲取文件最後一次修改的時間(單位,毫秒)二、容器18. java 容器都有哪些?Collections相當於一個工具類,可以reverse()逆序和sort()排序Collection是一個集合的接口,它提提供了具體的實現方法。有ArrayList(),LinkedList()20.List、Set、Map 之間的區別是什麼?
  • Java EE 8 和 GlassFish 5.0 發布,所有底層規範已獲批准!
    作者丨David Delabassee譯者 丨 雁驚寒GlassFish 5.0(Java EE 8開源參考實現)的通用性版本,以及Java EE 8總括規範和所有底層規範(JAX-RS 2.1、Servlet 4.0、CDI 2.0、JSON-B 1.0、Bean Validation 2.0等等)已經確定並獲得了批准!
  • 10分鐘看懂,Java NIO 底層原理
    內核緩衝與進程緩衝區1.1.2. java IO讀寫的底層流程1.2.​ 很多的小夥伴,被java IO 模型中,搞得有點兒暈,一會兒是4種模型,一會兒又變成了5種模型。​ 很多的小夥伴,也被nio這個名詞搞暈了,一會兒java 的nio 不叫 非阻塞io,一會兒java nio 又是非阻塞io,到底是啥呢?​ 很多的小夥伴,被異步和非阻塞搞暈了。都非阻塞了,難道不是異步的嗎?​ 這這,好難呀。
  • java分布式(java入門)
    asm和c一般用作底層開發通訊廠商、晶片廠商,還有一些單片機設備、白色家電、黑色家電,這些設備上運行的代碼大多數都是asm和c編寫的。c++和java是上層應用使用較多的程式語言,c++在遊戲和大型軟體開發中使用較多,當然這也和具體公司有關。按我的了解,c++在騰訊就用的比較多,java在阿里巴巴用的不少。
  • java編程IO基礎之一:File類
    在整個java.io包中,File類是唯一的一個與文件本身操作有關的類,既可以執行文件的創建、刪除、重命名,取得文件大小和修改日期。File的構造函數:public File(String pathname) 給定一個要操作文件的完整路徑。
  • 深入分析java集合ArrayList(源碼分析)
    它繼承了AbstractList,實現了List、RandomAccess, Cloneable, java.io.Serializable。2、繼承關係為此我們需要先知道ArrayList在整個java集合框架體系裡面處於一個什麼樣的位置。一張圖來說明:從上面我們發現ArrayList的最根部就是實現了Collection接口。