天天看點

Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類

Java I/O流

  • 處理方式分類
    • 字元流
    • 位元組流
  • 按照流的方向分類
    • 輸入流
    • 輸出流
  • Java中的流對象
    • 輸入位元組流
    • 輸出位元組流
    • 字元輸入流Reader
    • 字元輸出流Writer
  • 字元流與位元組流的轉換
    • 何時使用轉換流
    • 具體對象的展現
  • FIle
  • RandomAccessFile類

Java I/O也就是流 io=流

io是指對資料的輸入和輸出,i/o流主要分為兩大類,位元組流和字元流,位元組流可以傳輸任何資料(圖檔啊,電影啊,文字啊),隻能傳輸以字元為基礎的檔案;

io流的本質是資料傳輸,,而且是單向的;

流是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象。即資料在裝置間傳輸稱之為流。

流的本質是資料傳輸,根據資料傳輸的特性将流區分為各種類,友善更直覺的進行資料操作。

常用的位元組流

FileInput,FileOutPut,ObjectInputStream,ObjecOutputStrean

io分為阻塞型和非阻塞型nio,

IO:在讀取資料時,如果資料未到達,會一直阻塞到讀取到資料為止,是以稱為阻塞型IO,在高并發的環境下性能不佳。

NIO:NIO不是使用 “流” 來作為資料的傳輸方式,而是使用通道,通道的資料傳輸是雙向的,且NIO的資料寫入和讀取都是異步的,不會阻塞線程,是以稱為非阻塞型IO,在高并發的環境下性能很好。

Java流操作的相關類或者接口

檔案類:File

随機存儲檔案類:RandomAccessFile

位元組輸入流:InputStream

位元組輸出流:OutputStream

字元輸入流:Reader

字元輸出流:Writer

Java類流接口

Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類

處理方式分類

字元流

字元流:因為資料編碼的不同,而有了對字元進行高效操作的流對象,本質上其實就是對于位元組流的讀取時,去查了指定的碼表。

位元組流

位元組流:以8位元組為機關,可以讀取任何資料。

按照流的方向分類

程式中需要對傳輸資料不同而使用不同的輸入輸出流

輸入流

隻能進行讀操作

輸出流

隻能進行寫操作

Java中的流對象

輸入位元組流

Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類
  • InputStream是所有輸入位元組流的父類,是一個抽象類
  • ByteArrayInputSteam、StringBufferInputArray、FileInputSteam是三種媒體,分别從Byte數組,StringBuffer和File檔案中取得資料。PipeInputStream是從與其共用的線程裡讀取資料;
  • ObjectInputStream和所有FileInputStream 的子類都是裝飾流(裝飾器模式的主角)。

輸出位元組流

Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類
  • Output Stream是所有輸出位元組流的父類,他是一個抽象類
  • ByteArrayOutputStream、FIleOutputStream是兩種基本的媒體,它們分别向Byte 數組,和本地檔案中寫入資料。PipedOutputStream是從與其他線程共用的管道中寫入資料。
  • ObjectOutputStream和所有FileOutputStream的子類都是裝飾流。
Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類

圖中藍色為主要對應部分,紅色為不對應部分,黑色的虛線部分代表這些流一般需要搭配使用。從上面的圖中可以看出Java IO中的位元組流是非常對稱的。我們來看看這些位元組流中不對稱的幾個類。

  • LineNumberInputStream 主要完成從流中讀取資料時,會得到相應的行号,至于什麼時候分行、在哪裡分行是由改類主動确定的,并不是在原始中有這樣一個行号。在輸出部分沒有對應的部分,我們完全可以自己建立一個LineNumberOutputStream,在最初寫入時會有一個基準的行号,以後每次遇到換行時會在下一行添加一個行号,看起來也是可以的。好像更不入流了。
  • PushbackInputStream 的功能是檢視最後一個位元組,不滿意就放入緩沖區。主要用在編譯器的文法、詞法分析部分。輸出部分的BufferedOutputStream 幾乎實作相近的功能。
  • StringBufferInputStream 已經被Deprecated,本身就不應該出現在InputStream 部分,主要因為String 應該屬于字元流的範圍。已經被廢棄了,當然輸出部分也沒有必要需要它了!還允許它存在隻是為了保持版本的向下相容而已。
  • SequenceInputStream 可以認為是一個工具類,将兩個或者多個輸入流當成一個輸入流依次讀取。完全可以從IO 包中去除,還完全不影響IO 包的結構,卻讓其更“純潔”――純潔的Decorator 模式。
  • PrintStream 也可以認為是一個輔助工具。主要可以向其他輸出流,或者FileInputStream 寫入資料,本身内部實作還是帶緩沖的。本質上是對其它流的綜合運用的一個工具而已。一樣可以踢出IO 包!System.out 和System.out 就是PrintStream 的執行個體。

字元輸入流Reader

Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類
  • Reader是所有字元流的父類,他是一個抽象類
  • CharReader 和 StringReader分别從Char數組和String中讀取資料,PipedInputReader 是從與其他線程共用的管道中讀取資料。
  • BuffereReader 很明顯的是一個裝飾器,它和其子類複制裝飾其他Reader對象。
  • FilterReader 是所有自定義具體裝飾流的父類,其子類PushbackReader 對Reader 對象進行裝飾,會增加一個行号。
  • InputStreamReader 是一個連接配接位元組流和字元流的橋梁,它将位元組流轉變為字元流。
  • FileReader 可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了将FileInputStream轉變為Reader 的方法。我們可以從這個類中得到一定的技巧。Reader 中各個類的用途和使用方法基本和InputStream 中的類使用一緻。

字元輸出流Writer

Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類
  • Writer 是所有輸出字元流的父類,它是一個抽象類。
  • CharByteWriter和StringWriter是兩種基本的字元流媒體,分别向Char數組和String中寫入資料,PipedInputWriter 是從與其他線程共用的管道中讀取資料。
  • BuffereWriter 很明顯是一個裝飾器,他和其子類複制裝飾其他Writer對象。
  • FilterWriter 和PrintStream 及其類似,功能和使用也非常相似。
  • OutputStreamWriter 是OutputStream 到Writer 轉換到橋梁,它的子類FileWriter 其實就是一個實作此功能的具體類(具體可以研究一下SourceCode)。功能和使用OutputStream極其類似。
    Java I/O流處理方式分類按照流的方向分類Java中的流對象字元流與位元組流的轉換FIleRandomAccessFile類

字元流與位元組流的轉換

何時使用轉換流

  • 但需要将位元組檔案轉換成字元檔案時
  • 操作資料需要編碼或者解碼的時候

具體對象的展現

InputStreamReader:位元組到字元的橋梁

OutputStreamWriter:字元到位元組的橋梁

這兩個流對象時字元體系中的成員,它們有轉換的作用,本身又是字元流,是以在構造的時候需要傳入位元組流對象進來。

FIle

File類是對檔案系統中檔案以及檔案夾進行封裝的對象,可以通過對象的思想來操作檔案和檔案夾。File類儲存檔案或目錄的各種資料資訊,包括檔案名、檔案長度、最後修改時間、是否可讀、擷取目前檔案的路徑名、判斷檔案是否存在、擷取目前目錄中的檔案清單、建立、删除檔案和目錄等方法。

RandomAccessFile類

該對象不是流體系中的一員,其封裝了位元組流,同時還封裝了一個緩沖區(字元數組),通過内部的指針來操作字元數組中的資料。該對象特點:

該對象隻能操作檔案,是以構造函數接受兩種資料類型的參數:

  • 字元串檔案路徑
  • File對象

該對象既可以對檔案進行讀操作,也能進行寫操作,在進行對象執行個體化時可指定操作模式(r , rw)。

注意:該對象在執行個體化時,如果要操作的檔案不存在,會自動建立;如果檔案存在,寫資料未指定位置,會從頭開始寫,即覆寫原有的内容。可以用于多線程下載下傳或多個線程同時寫資料到檔案。