JavaSE知識(shí)點(diǎn)15java輸入輸出流詳解

1 什么是IO?

  • 1 Java的IO機(jī)制有流IO和塊IO兩種,核心庫 java.io是大多數(shù)面向數(shù)據(jù)流的IO類的主要軟件包;核心庫 java.nio中采用的便是塊IO。流IO的好處是簡(jiǎn)單易用,缺點(diǎn)是效率較低。塊IO效率很高,但編程比較復(fù)雜。
  • 2 流IO基于數(shù)據(jù)流進(jìn)行輸入輸出,這些數(shù)據(jù)流表示了字符或者字節(jié)數(shù)據(jù)的流動(dòng)序列。Java的流IO提供了讀寫數(shù)據(jù)的標(biāo)準(zhǔn)方法。在Java中任何數(shù)據(jù)源的對(duì)象都支持?jǐn)?shù)據(jù)流的方式進(jìn)行數(shù)據(jù)的讀寫。
  • 3 Java 流IO模型使用Decorator模式,按功能劃分Stream,可以動(dòng)態(tài)裝配這些Stream,以便獲得需要的功能。例如,需要一個(gè)具有緩沖的文件輸入流,則應(yīng)當(dāng)組合使用FileInputStream和BufferedInputStream。

2 數(shù)據(jù)流的概念

  • 1 數(shù)據(jù)流是一串連續(xù)不斷的數(shù)據(jù)的集合。流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向數(shù)據(jù)源的流;當(dāng)程序需要寫入數(shù)據(jù)的時(shí)候,就會(huì)開啟一個(gè)通向目的地的流。采用數(shù)據(jù)流的目的就是使得輸出輸入獨(dú)立于設(shè)備。


    IO stream
  • 2 將數(shù)據(jù)從外存中讀取到內(nèi)存中的稱為輸入流。即輸入流是將數(shù)據(jù)源(鍵盤、文件、網(wǎng)絡(luò)…)中的數(shù)據(jù)讀入到程序的通信通道。
    Input Stream
  • 3 將數(shù)據(jù)從內(nèi)存寫入外存中的稱為輸出流。即輸出流是將程序中的數(shù)據(jù)輸出到外界(顯示器、打印機(jī)、文件、網(wǎng)絡(luò)…)的通信通道。
    Output Stream
  • 4 流序列中的數(shù)據(jù)既可以是未經(jīng)加工的原始二進(jìn)制數(shù)據(jù),也可以是經(jīng)一定編碼處理后符合某種格式規(guī)定的特定數(shù)據(jù)。
  1. 字節(jié)流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字節(jié)
  2. 字符流:數(shù)據(jù)流中最小的數(shù)據(jù)單元是字符, 以Unicode編碼,一個(gè)字符占用兩個(gè)字節(jié)。
  • 5 流IO層次體系結(jié)構(gòu)
    Java I/O主要包括如下幾個(gè)層次,包含三個(gè)部分:
    1)流式部分即流IO的主體部分,如Input/OutputStrean類、Reader/Writer類和標(biāo)準(zhǔn)輸入輸出流等;
    2)非流式部分主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor類等;
    3)其他類--文件讀取部分的與安全相關(guān)的類,如:SerializablePermission類、FileSystem類和Win32FileSystem類等。

3 字節(jié)流

3.1 輸入字節(jié)流

  • 1 InputStream(二進(jìn)制格式操作): 為字節(jié)輸入流,它本身為一個(gè)抽象類,必須依靠其子類實(shí)現(xiàn)各種功能,此抽象類是表示字節(jié)輸入流的所有類的超類。 繼承自InputStream的流都是向程序中輸入數(shù)據(jù)的,且數(shù)據(jù)單位為字節(jié)(8bit)。
  • 2 Inputstream類的常用子類
    1) FileInputStream把一個(gè)文件作為InputStream,實(shí)現(xiàn)對(duì)文件的讀取操作
    2) ByteArrayInputStream:把內(nèi)存中的一個(gè)緩沖區(qū)作為InputStream使用
    3) StringBufferInputStream:把一個(gè)String對(duì)象作為InputStream
    4) PipedInputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用
    5) SequenceInputStream:把多個(gè)InputStream合并為一個(gè)InputStream
  • 3 Inputstream類中的常用方法
    1) public abstract int read( ):讀取一個(gè)byte的數(shù)據(jù),返回值是高位補(bǔ)0的int類型值。若返回值=-1說明沒有讀取到任何字節(jié)讀取工作結(jié)束。
    2) public int read(byte b[ ]):讀取b.length個(gè)字節(jié)的數(shù)據(jù)放到b數(shù)組中。返回值是讀取的字節(jié)數(shù)。該方法實(shí)際上是調(diào)用下一個(gè)方法實(shí)現(xiàn)的。
    3) public int read(byte b[ ], int off, int len):從輸入流中最多讀取len個(gè)字節(jié)的數(shù)據(jù),存放到偏移量為off的b數(shù)組中。
    4) public int available( ):返回輸入流中可以讀取的字節(jié)數(shù)。注意:若輸入阻塞,當(dāng)前線程將被掛起,如果InputStream對(duì)象調(diào)用這個(gè)方法的話,它只會(huì)返回0,這個(gè)方法必須由繼承InputStream類的子類對(duì)象調(diào)用才有用。
    5) public long skip(long n):忽略輸入流中的n個(gè)字節(jié),返回值是實(shí)際忽略的字節(jié)數(shù), 跳過一些字節(jié)來讀取。
    6) public int close( ) :我們?cè)谑褂猛旰螅仨殞?duì)我們打開的流進(jìn)行關(guān)閉。

3.2 輸出字節(jié)流

  • 1 OutputStream(二進(jìn)制格式操作):抽象類?;谧止?jié)的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
  • 2 Outputstream類的常用子類
  1. ByteArrayOutputStream:把信息存入內(nèi)存中的一個(gè)緩沖區(qū)中
  2. FileOutputStream:把信息存入文件中
  3. PipedOutputStream:實(shí)現(xiàn)了pipe的概念,主要在線程中使用
  4. SequenceOutputStream:把多個(gè)OutStream合并為一個(gè)OutStream


  • 3 Outputstream類中的常用方法
    1)public void write(byte b[ ]):將參數(shù)b中的字節(jié)寫到輸出流。
    2)public void write(byte b[ ], int off, int len) :將參數(shù)b的從偏移量off開始的len個(gè)字節(jié)寫到輸出流。
    3)public abstract void write(int b) :先將int轉(zhuǎn)換為byte類型,把低字節(jié)寫入到輸出流中。
    4)public void flush( ) : 將數(shù)據(jù)緩沖區(qū)中數(shù)據(jù)全部輸出,并清空緩沖區(qū)。
    5)public void close( ) : 關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源。

4 字符流

Java中字符是采用Unicode標(biāo)準(zhǔn),一個(gè)字符是16位,即一個(gè)字符使用兩個(gè)字節(jié)來表示。為此,JAVA中引入了處理字符的流。

4.1 輸入字符流

  • 1 Reader抽象類,基于字符的輸入操作。子類必須實(shí)現(xiàn)的方法只有 read(char[], int, int) 和 close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
  • 2 常用子類
    1)FileReader :與FileInputStream對(duì)應(yīng)
    2)CharArrayReader:與ByteArrayInputStream對(duì)應(yīng)
    3)StringReader : 與StringBufferInputStream對(duì)應(yīng)
    4)InputStreamReader 從輸入流讀取字節(jié),在將它們轉(zhuǎn)換成字符
    5)FilterReader: 允許過濾字符流
    6)BufferReader :接受Reader對(duì)象作為參數(shù),并對(duì)其添加字符緩沖器,使用readline()方法可以讀取一行。
  • 3 常用方法
    1)public int read() throws IOException; //讀取一個(gè)字符,返回值為讀取的字符
    2)public int read(char cbuf[]) throws IOException; /讀取一系列字符到數(shù)組cbuf[]中,返回值為實(shí)際讀取的字符的數(shù)量/
    3)public abstract int read(char cbuf[],int off,int len) throws IOException;
    /讀取len個(gè)字符,從數(shù)組cbuf[]的下標(biāo)off處開始存放,返回值為實(shí)際讀取的字符數(shù)量,該方法必須由子類實(shí)現(xiàn)/

4.2 輸出字符流

  • 1 Writer(文件格式操作):抽象類,基于字符的輸出操作。寫入字符流的抽象類。子類必須實(shí)現(xiàn)的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數(shù)子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
  • 2 常用子類
    1)FileWrite: 與FileOutputStream對(duì)應(yīng),將字符類型數(shù)據(jù)寫入文件,使用缺省字符編碼和緩沖器大小。
    2)chararrayWrite:與ByteArrayOutputStream對(duì)應(yīng) ,將字符緩沖器用作輸出。
    3)PrintWrite:生成格式化輸出。
    4)FilterWriter:用于寫入過濾字符流。
    5)PipedWriter:與PipedOutputStream對(duì)應(yīng)。
    6)StringWriter:無與之對(duì)應(yīng)的以字節(jié)為導(dǎo)向的stream。
  • 3 ** 常用方法**
    1)public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流
    2)public void write(char cbuf[]) throws IOException; //將字符數(shù)組cbuf[]寫入輸出流
    3)public abstract void write(char cbuf[],int off,int len) throws IOException; //將字符數(shù)組cbuf[]中的從索引為off的位置處開始的len個(gè)字符寫入輸出流
    4)public void write(String str) throws IOException; //將字符串str中的字符寫入輸出流
    5)public void write(String str,int off,int len) throws IOException; //將字符6)flush( ) //刷空輸出流,并輸出所有被緩存的字節(jié)。
    7)close() 關(guān)閉流 public abstract void close() throws IOException。

5 如何選擇IO流?

  • 1 確定是數(shù)據(jù)源和數(shù)據(jù)目的(輸入還是輸出)
    源:輸入流 InputStream 或 Reader
    目的:輸出流 OutputStream 或 Writer
  • 2 明確操作的數(shù)據(jù)對(duì)象是否是純文本
    是:字符流Reader或Writer
    否:字節(jié)流InputStream或OutputStream
  • 3 明確具體的設(shè)備。
    1)硬盤文件:FileInputStream 或 FileReader,F(xiàn)ileOutputStream 或 FileWriter
    2)內(nèi)存用數(shù)組byte[]:ByteArrayInputStream 或 ByteArrayOutputStream
    3)char[]:CharArrayReader 或 CharArrayWriter
    4)網(wǎng)絡(luò)用Socket流
    5)鍵盤:System.in 或 System.out
  • 4 否需要轉(zhuǎn)換流
    就使用轉(zhuǎn)換流InputStreamReader/OutputStreamWriter將Stream轉(zhuǎn)化為Reader/Writer
  • 5 否需要緩沖提高效率
    就加上Buffered:BufferedInputStream/BufferedOuputStream,以及BuffereaReader/BufferedWriter。

6 IOException異常類的子類

  • 1 public class EOFException :
    非正常到達(dá)文件尾或輸入流尾時(shí),拋出這種類型的異常。
  • 2 public class FileNotFoundException:
    當(dāng)文件找不到時(shí),拋出的異常。
  • 3 public class InterruptedIOException:
    當(dāng)I/O操作被中斷時(shí),拋出這種類型的異常。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、流的概念和作用。 流是一種有順序的,有起點(diǎn)和終點(diǎn)的字節(jié)集合,是對(duì)數(shù)據(jù)傳輸?shù)目偝苫虺橄?。即?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,324評(píng)論 2 95
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,824評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,692評(píng)論 19 139
  • [導(dǎo)讀]我們身邊總會(huì)有很多很有經(jīng)濟(jì)實(shí)力的人,他們的座駕看似低調(diào),實(shí)則深藏功與名,那這些人都會(huì)選擇哪些符合車子作為座...
    顧爺有約閱讀 729評(píng)論 0 0
  • 今天是23歲的生日,沒有太多的喜悅,反而越感孤單 23歲-畢業(yè)一年多了 -職場(chǎng)菜鳥 -住在員工宿舍...
    DoraWZ閱讀 677評(píng)論 2 3

友情鏈接更多精彩內(nèi)容