think in java i o_5.[Think in Java笔记]Java IO系统
1.輸入輸出
InputStream和OutputStream是面向字節的,Reader和Write則面向字符的且兼容Unicode。
InputStream類型
ByteArrayInputStream:允許將內存的緩沖區當作InputStream使用
StringBufferInputStream:將String轉換成InputStream
FileInputStream:用于從文件中讀取信息
PipedInputStream:產生用于寫入相關InputStreamOutputStream的數據。實現管道化概念
SequenceInputStream:將兩個或多個InputStream對象轉換成單一InputStream
FilterInputStream:抽象類,作為裝飾器的接口
OutputStream類型
ByteArrayOutputStream:在內存中創建緩沖區,所有送往流的數據都要放置在此緩沖區
FileOutputStream:用于將信息寫至文件
PipedOutputStream:任何寫入其中的信息都會自動作為相關PipedInputStream的輸出
FilterOutputStream:抽象類,作為裝飾器的接口
FilterInputStream類型
DataInputStream:與DataOutputStream搭配使用,因此可以按照可移植方式從流讀取基本數據類型
BufferedInputStream:使用它可以防止每次讀取時都得到進行實際寫操作。代表使用緩沖區
LineNumberInputStream:跟蹤輸入流中的行號;可調用getLineNumber()和setLineNumber(int)
PushbackInputStream:具有能彈出一個字節的緩沖區。因此可以將最后的最后一個字符回退
FilterOutputStream類型
DataOutputStream:與DataInputStream搭配使用,因此可以按照可移植方式從流寫入基本數據類型
PrintStream:用于產生格式化輸出。其中DataOutputStream處理數據的存儲,PrintStream處理顯示
BufferedOutputStream:使用它可以防止每次發送時都得到進行實際寫操作。代表使用緩沖區
RandomAccessFile
RandomAccessFile是一個完全獨立的類,直接從Object派生。
2.I/O流的使用
緩沖輸入文件
如果想打開一個文件用于字符輸入,可以用String或File對象作為文件名的FileInputStream,為了提高速度,對文件進行緩沖,將產生的引用傳遞給一個BufferedReader構造器。
String filename;
BufferedReader in = new BufferedReader(newFileReader(filename));
從內存輸入
StringReader in = newStringReader(BufferedInputFile.read("MemoryInput.java"));
格式化的內存輸入
要讀取格式化數據,可使用DataInputStream。必須為ByteArrayInputStream提供字節數組。
DataInputStream in = newDataInputStream(new ByteArrayInputStream(BufferedInputFile.read("FormattedMemoryInput.java").getBytes()));
文件輸出
FileWriter對象可以向文件寫入數據。
String file = "BasicFileOutput.out";
PrintWriter out = new PrintWriter(newBufferedWriter(new FileWriter(file)));
文本文件輸出的快捷方式
String file = "BasicFileOutput.out";
PrintWriter out = new PrintWriter(file);
存儲和恢復數據
如果使用DataOutputStream寫入數據,Java保證可以使用DataInputStream準確地讀取數據,無論讀和寫數據的平臺多么不同。
讀寫隨機訪問文件
RandomAccessFile除了實現DataInput和DataOutput接口,與I/O繼承層次結構的其他部分實現了分離,RandomAccessFile不支持裝飾,所以不能將其與InputStream和OutputStream子類的任何部分組合。
3.標準I/O
程序的所有輸入都可以來自標準輸入,它的所有的輸出都可以發送到標準輸出,以及所有的錯誤都可以發送到標準錯誤。
標準I/O的意義在于:可以很容易的把程序串聯起來,一個程序的標準輸出可以稱為另一個程序的標準輸入。
從標準輸入中讀取
按標準I/O模型,Java提供了System.in、System.out和System.err。其中System.out和System.err實現被包裝成了printStream對象,System.in卻是一個沒有被包裝過的未經加工的InputStream。即可以立即使用System.out和System.err,但在讀取System.in之前必須對其進行包裝。
將System.in包裝成BufferedReader來使用,但這要求必須用InputStreamReader把System.in轉換成Reader。
BufferedReader in = newBufferedReader(new InputStreamReader(System.in));
將System.out轉換成PrintWriter
System.out是一個PrintStream,而PrintStream是一個OutputStream。PrintWriter有一個可以傳參的構造器,因此使用哪個構造器把System.out轉換成PrintWriter。
PrintWriter out = newPrintWriter(System.out, true);
標準I/O重定向
I/O重定向操作的是字節流,不是字符流;因此使用的是InputStream和OutputStream,而不是Reader和Writer。
4.新I/O
java.nio.*包引入新的Java I/O類庫,其目的在于提高速度。速度提高來自于所使用的數據結構更接近操作系統執行I/O方式:通道和緩沖器。
唯一直接與通道交互的緩沖器是ByteBuffer,即可以存儲未加工字節的緩沖器。
5.對象序列化
如果對象能夠在程序不運行的情況下,仍能保存其運行信息,那么在下次運行時,該對象被重載并擁有的信息與程序上次運行時所擁有信息相同。當然,可以通過將信息寫入文件或數據庫來實現,但如果將一個對象聲明為“持久性”,并處理所有細節,那將會十分方便。
Java的對象序列化是將那些實現了Serializable接口的對象轉換成一個字節序列,并能夠在以后將這個字節序列完全恢復為原來的對象。
利用對象序列化可以實現輕量級持久性。持久性意味著一個對象的生存周期不取決于程序是否正在執行,他可以生存于程序的調度之間。通過將一個序列化對象寫入磁盤,然后在重新調用程序時恢復該對象,就能夠實現持久性的效果。之所以稱輕量級,是因為不能用某種關鍵字來簡單地定義一個對象,并讓系統自動維護其他細節問題。
Java對象序列化支持兩種特性:
一是Java的遠程方法調用(RMI),它使存活于其他計算機上的對象使用起來就像存活于本機上一項。
二是對Java Beans來說,對象序列化是必須的。使用一個Bean是,它的狀態信息是在設計時進行配置,這種狀態信息必須保存下來,并在程序啟動時進行后期恢復,這種具體的工作就是有對象序列化完成的。
對象序列化:創建一個OutputStream,然后將其封裝在一個ObjectOutputStream對象內,通過調用writeObject()方法即可將對象序列化
對象反序列化:創建一個InputStream,封裝在ObjectInputStream內,調用readObject()方法
說明:筆記內容摘自《SCJP考試指南》和《Think in Java》
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的think in java i o_5.[Think in Java笔记]Java IO系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php写入大文件内容_用PHP读取超大文
- 下一篇: php 数组转为json,php怎么将数