欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

IO流的介紹

系統 1639 0
對于任何程序設計語言而言,輸入輸出(I/O)系統是最復雜的一部分,因為通信的雙方不僅僅是I/O源端和接收端,還可能是文件、網絡鏈接或內存磁盤等,而且這些數據的數據格式多樣,如字符、二進制、字節。Java通過創建大量的類庫解決這個問題。
12.1? 流(stream)的概念
Java的I/O系統涉及流的概念。一個讀取字節序列的對象被稱為輸入流,一個可以寫入字節序列的對象稱為輸出流。輸出流和輸入流是相對于程序本身而言的。程序讀取數據稱為打開輸入流,程序向其他源寫入數據稱為打開輸出流,該過程如圖所示。

12.2? 字符流
在Java的I/O系統提供了InputStream和OutputStream兩個抽象類實現字節(8位)數據的輸入輸出,其中InputStream是輸入流的抽象類,提供了read方法,各個實現了該類的子類都要實現該方法,如 ObjectInputStream類繼承InputStream抽象類,重新定義了方法read()來讀取字節數據。本節介紹抽象類 InputStream和OutputStream及其相對應的子類。
12.2.1 輸入流類InputStream
抽象類InputStream表示從不同的輸入源輸入數據的類,這些數據源的數據類型多樣,可以是字節數組、String對象、類的序列化對象,文件、管道或網絡鏈接。對于多樣的數據類型有相應的輸入流類與其對應。下面介紹這些流類,使讀者對這些類的功能和使用方式有基本的了解。
InputStream是個抽象類,提供了抽象read方法,下面幾個類是繼承自InputStream 的子類:
ByteArrayInputStream(字節數組輸入流)
FileInputStream(文件輸入流)
PipedInputStream(管道輸入流)
SequenceInputStream(序列化輸入流)
StringBufferInputStream(字符串緩沖輸入流)
ObjectInputStream(對象輸入流)
FilterInputStream(過濾器輸入流)
以下的類繼承自 FilterInputStream(過濾器輸入流),同時實現了DataInput接口。
LineNumberInputStream(行號輸入流)
DataInputStream(數據輸入輸入流)
BufferedInputStream(緩沖輸入流)
PushbackInputStream(推回輸入流)
12.2.2輸出流類OutputStream
抽象類OutputStream是表示輸出數據流的抽象類,與抽象輸入流對應,提供各種流對象的數據輸出。下面介紹的輸出流類,可以使讀者了解輸出流類的功能和使用方式。
OutputStream是個抽象類,提供了抽象write方法,下面幾個類是繼承自InputStream的子類,這些類都實現了write()方法:
ByteArrayOutputStream(字節數組輸出流類)
FileOutputStream(文件輸出流類)
ObjectOutputSteam(對象輸出流類)
PipedOutputStream(管道輸出流類)
FilterOutputStream(過濾器輸出流類)
下面三個類繼承自FilterOutputStream類并實現了 DataOut接口。
DataOutputStream(數據輸出流類)
BufferedOutputStream(緩沖輸出流類)
PrintStream(打印輸出流類)
12.3? 字節流
Java在設計其I/O系統時,把輸入輸出的數據類型分為兩類,一類是字符流,如上節介紹的InputStream 和OutputStream類及其子類都是處理字符(16bit)流。本節介紹字節(8bit)流,字節流也分為讀流數據類和寫流數據類,即Reader 類和Writer類及其子類。
12.3.1? Writer類
Writer類是字符(Character)流輸出類的父類,它是抽象類,所有繼承自該類的子類都必須實現抽象方法write,具體的實現類中write方法的使用可以參考相應的JavaDoc文檔。這里為了區別InputStream和 OutputStream使用了Reader和Writer,為了使讀者習慣于使用Reader和Writer,同時中文中沒有合適的詞匯表達相應的流的概念,所以不在具體翻譯為中文,讀者使用時只要知道Reader類負責讀流數據,而Writer類負責向流中寫數據。下面列出繼承自Writer類的子類。
BufferedWriter(帶緩沖Writer)
CharArrayWriter(字符數組Writer)
FilterWriter(帶過濾器 Writer)
PrintWriter(打印Writer)
PipedWriter(管道Writer)
StringWriter(字符串Writer)
OutputStreamWriter(輸出流Writer)
12.3.2? Reader類
Reader類是讀取字符(Character)流的父類,它是抽象類,所有繼承自該類的子類都必須實現抽象方法read和close,具體的實現類中read方法的使用可以參考相應的JavaDoc文檔。下面列出繼承自Reader類的子類。
BufferedReader(帶緩沖Reader)
CharArrayReader(字符數組Reader)
FileReader(文件Reader)
FilterReader(過濾器Reader)
InputStreamReader(輸入流Reader)
LineNumberReader(帶行號Reader)
PipedReader(管道Reader)
PushbackReader(推回Reader)
StringReader(字符串Reader)
12.4? File類
File類最初看起來仿佛是代表文件,其實這點Java為該類起名確實有迷惑讀者的地方,其實File類可以表示特定文件名(帶絕對路徑),也可以是某個目錄下多一組文件,該類提供了方法可以用來訪問多個文件。File類提供了豐富的方法來處理和文件或目錄相關的操作。如創建和刪除文件、創建和刪除文件夾、通過和其他類配合使用實現文件的復制和移動等。本節將介紹File類提供的這些功能。
12.4.1? 創建文件夾(目錄)
File類提供了豐富的接口函數供用戶調用。創建目錄是文件操作中經常遇到的情形,目錄提供了文件存放的位置,用戶可以根據需要在磁盤空間上建立目錄。建立目錄的方法是調用mkdir()方法,代碼為創建文件夾程序示例。

12.4.2? 創建文件
在Java的File類中創建新文件只需要調用該類的一個方法createNewFile(),但是在實際操作中需要注意一些事項,如判斷文件是否存在,以及如何向新建文件中寫入數據等。代碼創建文件示例演示了上述討論的問題。該程序首先創建一個用戶指定名稱和類型的數據,并向文件中寫書數據。

12.4.3? 復制文件
文件的復制設計到文件流的概念,在下節將更詳細的介紹文件流操作,本節為了實現文件操作,使用了 FileInputStream和FileOutputStream兩個流類。通過文件輸入流讀取源文件,通過文件輸入流把讀入緩沖區的字節數據寫入新文件,如果該新文件已經存在則覆蓋掉該文件如果不存在則新建一個文件, 代碼為復制文件程序示例。

12.4.4? 刪除文件
在Java的File類中刪除文件只需要調用該類的一個方法delete(),該方法可以刪除指定的文件。代碼刪除文件程序說明了該方法的具體使用方式。在程序執行時,用戶給出要刪除的文件的目錄和文件名或文件夾,就可以完成刪除操作。

12.4.5? 刪除文件夾
在Java的File類中刪除文件夾需要首先刪除掉文件夾中的文件,再刪除空文件夾,刪除空文件夾的方法與刪除文件的方法相同,所以關鍵是如何實現刪除文件夾下的所有文件。上面已經知道如何刪除一個文件,可以想象欲刪除一個目錄下的所有文件只要獲得該文件的目錄和文件名,使一個循環調用來依次刪除文件夾中的文件即可。代碼12-9就是依照這種思路實現了刪除文件夾中的多個文件并刪除文件夾。
該類提供了兩個方法,一個方法是刪除文件夾,另一個是刪除文件夾下的文件。如果在刪除文件夾時,既有目錄又有文件,則刪除文件,再繼續刪除文件夾,如果該文件夾下還是既有文件又有文件夾則繼續上面的操作,直到把目錄下的文件和子目錄全部刪除。該過程的流程圖如圖所示。
12.5? I/O流的典型運用
通過12.3節和12.4節的內容知道整個I/O類庫提供了兩類流,一種是字符流,所有處理該字符(Character)型數據的輸入輸出流類都繼承自InputStream和OutStream。一種是字節(Byte)流,所有處理字節流數據的輸入輸出流類都繼承自Reader和Writer類。
本節介紹JavaI/O的幾類典型應用,包括處理字節流和字符流數據。
12.5.1? 文件流
文件流操作的目的是實現文件之間的數據傳輸,把數據從一個文件復制到另一個文件。文件的輸入流可以是流類的對象如:FileReader,FileInputStream。文件的輸入流是一個流類的對象如:FileWriter,FileOutputStream。 通過在文件上建立流,來實現文件間的數據傳輸。代碼文件流操作示例,展示了如何通過這些流類實現文件的復制。

12.5.2? 讀取內存數據
在Java的輸入輸出流中 提供了讀取內存數據的類,這些類包括StringReader和StringWriter、CharArrayReader和 CharArrayWriter、ByteArrayInputStream和ByteArrayOutputStream。在內存中讀寫數據通常是在已經存在的數組中創建I/O流。本節以StringReader和StringWriter為例,這兩個類用于從內存中的一個字符串中讀寫數據。首先看代碼讀內存數據示例。

12.5.3? 鏈接文件
Java提供SequenceInputStream類把多個輸入流鏈接起來放在一個輸入流中。多個輸入流可以存入 Enumeration對象。將依次讀取每個流對象內的數據,直到最后一個流對象的結尾。也可以直接鏈接兩個輸入流。這通過構造函數實現。代碼就是鏈接文件的例子,首先創建兩個輸入流,再直接鏈接這兩個輸入流,打印到控制臺輸出,代碼創建RMI服務器程序示例。

12.5.4? 管道流
兩種管道流,一種是通過PipedInputStream和PipedOutputStream實現,一種是通過PipedReader和PipedWriter實現。
管道流是對應多線程的概念,實現線程間通信,它建立在兩個線程之上,它的實現原理是在管道的一端讀入數據,而在管道的另一端讀出輸入。實現管道流時,關鍵是在線程中建立管道。體現在下面兩行關鍵語句中。
PipedWriter pipeOut = new PipedWriter();
PipedReader pipeIn = new PipedReader(pipeOut);
12.5.5? 隨機訪問文件
類RandomAccessFile實現文件的隨機訪問,可以在文件的任意位置讀取或寫入數據。該類與 InputStream和OutputStream不同。它把輸入輸出放入同一個類中,通過構造函數的參數確定是輸入還是輸出或輸入輸出操作可同時實現。該類的構造函數有兩個參數,第一個參數是文件目錄,第二個參數指定相應的操作,“r”讀,“rw”讀寫。
RandomAccessFile in = new RandomAccessFile(“readme.txt”,”rw”);
RandomAccessFile in = new RandomAccessFile(“readme.txt”,”r”);
12.5.6? 從標準輸入讀取
按照標準I/O模型,Java 提供了標準的輸入輸出方式,而System.out是經過包裝的流對象,可以將數據寫出到標準輸出,但是System.in無法直接實現數據輸入,因為 System.in是沒有包裝的流,所以在讀取標準輸入前必須對System.in進行包裝。
在代碼中用InputStreamReader來包裝System.in成Reader,再包裝成BufferedReader,先從標準輸入讀數據放入緩存,再從緩存中讀出數據賦予變量s,最后從變量 s中讀取數據在屏幕上輸出。

12.5.7? I/O重定向
I/O重定向是指把標準輸入定向到一個文件,把這個文件作為程序輸入源,而把數據輸出到一個指定的文件。因為I/O操縱的是字節流,所以采用InputStream和OutputSteam流類族實現輸入輸出重定向。
12.5.8? 過濾流
按照標準I/O模型,Java 提供了標準的輸入輸出方式,而System.out是經過包裝的流對象,可以將數據寫出到標準輸出,但是System.in無法直接實現數據輸入,因為 System.in是沒有包裝的流,所以在讀取標準輸入前必須對System.in進行包裝。
代碼中用InputStreamReader來包裝 System.in成Reader,再包裝成BufferedReader使用。

12.5.9? 序列化對象
對象的序列化后的輸入輸出通過ObjectInputStream和ObjectOutputStream 類實現。序列化的本質是把具有一定結構的Java對象進行打包,而后通過特定的輸入輸出流來處理。本節將學習使用Java提供的對象輸入輸出類來實現序列化對象的傳輸。
類ObjectInputStream和ObjectOutputStream不能單獨使用,必須附加在其他流之上,對其他輸入輸出流進行包裝,因為對象的輸入輸出必須對應一個存儲對象的文件,這里采用文件輸入輸出流對象作為對象輸入輸出流對象的參數來構造對象輸入輸出流對象,實現對象在文件之間的傳輸。OjbectInputStream類提供了各種read方法讀取特定類型的數據,如readObject()、 readInt()、readBoolean()等方法讀取流中的對象。OjbectOutputStream類提供了各種write()方法讀取特定類型的數據,如writeObject()、writeInt()、writeBoolean()等方法向流中的寫入數據。
12.6? 習題
(1)選擇題
1.Java I/O流按處理的數據類型分為哪兩類:
A.比特流和字符流? B.比特流和字節流
C.字符流和字節流? D.管道流和過濾流
2.實現多線程間通信使用的流是:
A.Object Stream? B.Random Access Stream
C.File Stream? D.Piped Stream
3.為了讀取或修改一個文件的指定位置的數據,需要使用的流是:
A.Object Stream? B.Random Access Stream
C.Filter Stream? D.Piped Stream
4.有一個對象需要傳輸給另一個程序,此時考慮使用的流是:
A.Object Stream? B.Random Access Stream
C.File Stream? D.Piped Stream
5.常用的對讀取文件數據的流是:
A.Object Stream? B.Random Access Stream
C.File Stream? D.Piped Stream
6.如果需要把多個輸入流合并到一個輸入流的是:
A.Object Stream? B.Sequence object Stream
C.File Stream? D.Piped Stream
(2)簡答題
1.解釋I/O重定向的含義和設計到的輸入輸出類。
2.過濾流的功能以及設計到的類。
3.將多個輸入流合并到一個輸入流的類為 SequenceObjectStream,解釋該類的兩個構造函數。
4.參考JavaDoc文檔,查看File類的各種方法,做到熟練使用文件的各種操作。
(3)編程題
1.參考12.5.1編寫一個類,該類可以讀取自己的.java文件,把該文件存儲到一個.xls文件中,并在控制臺打印文件內容。
2.改寫12.5.3節的示例程序,調用SequenceInputStream的另一個構造函數實現多個(大于2個)文件的鏈接任務,該構造函數形式為SequenceInputStream(Enumeration enu)。

IO流的介紹


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 毛片在线视频 | 草草免费观看视频在线 | 久久久久久久成人 | 91看片在线看片 | 亚洲综合五月天欧美 | 人人干日日干 | 中文二区 | 麻豆短视频app网站 天天澡天天碰天天狠伊人五月 | 开心深爱激情 | 欧洲精品久久久 | 国产精品无码2021在线观看 | 欧美一级精品 | 美乃雀中文字幕在线一区 | 亚洲日本中文字幕区 | 亚洲高清在线看 | 天天干天操| 欧美久久视频 | 国产日韩精品久久 | 欧美特黄aaaaaa | 精久久久 | 91伦理片| 国产萝控精品福利视频免费观看 | 艹逼 | 久久久一区二区三区不卡 | 九九热在线免费观看 | 亚洲狠狠婷婷综合久久久久图片 | 日韩18视频在线观看 | 国内精品玖玖玖玖电影院 | 色播在线视频 | 国产精品欧美一区二区三区 | 久久久久国产精品美女毛片 | 国产午夜一区二区在线观看 | 日韩欧美色| 青青青青久久久久国产的 | 日韩一区二区免费看 | 国产麻豆 | 国产成人www| 性久久久久久久久波多野结衣 | 欧美色欧美色 | 久久精品免费国产 | 99精品视频在线观看re |