1. 程式人生 > >我的學習之路_第十一章_字符流

我的學習之路_第十一章_字符流

之間 才會 fileutil output keys 返回 ont 讀取數據 一個

【字符流】

IO流的分類

★字節流 操作的文件不是文本文件

字節輸入流: InputStream 抽象類

FileInputStream操作文件的字節輸入流

字節輸出流: OutputStream 抽象類

FileOutputStream操作文件的字節輸出流


★字符流 操作的文件是文本文件

字符輸入流: Reader 抽象類

FileReader 用來操作文件的字符輸入流

字符數出流: Writer 抽象類

FileWriter 用來操作文件的字符輸出流


【轉換流】

▲OutputStreamWriter extends Writer 所屬包:java.io.OutputStreamWriter

作用:是字符流通向字節流的橋梁,可以指定編碼表

繼承自父類 Writer 的公共成員方法

寫一個字符,寫字符數組,寫字符數組的一部分,寫字符串,寫字符的一部分,刷新,關閉

構造方法:

OutputStreamWriter(OutputStream out,String charsetName) 創建使用指定字符集的 OutputStreamWriter

參數:
OutputStream out : 字節輸出流(把轉換後的字節寫入到文件中)
可以傳入FileOutputStream
String charsetName : 編碼表名稱
可以傳入一個字符串格式的編碼表名稱,比如"GBK","utf-8"...,編碼表名稱不區分大小寫,如果不寫默認為系統碼表
使用步驟:
1.創建字符輸出流FileOutputStream,綁定數據的目的地
2.創建轉換流OutputStreamWriter對象,構造方法中傳入FileOutputStream和指定的編碼表名稱
3.調用OutputStreamWriter中寫數據的方法,把數據寫入到內存緩沖區中
4.釋放資源,並把數據刷新到文件中


▲InputStreamReader extends Reader

作用:是字符流通向字節流的橋梁,可以指定編碼表

繼承自父類 Writer 的公共成員方法

int read() 讀取單個字符.
int read(char[] cbuf) 將字符讀入數組
abstract void close() 關閉該流並釋放與之關聯的所有資源.

構造方法:

InputStreamReader(InputStream in) 創建一個使用默認字符集的InputStreamReader
InputStreamReader(InputStream in,String charsetName) 創建使用指定字符集的 InputStreamReader

參數: InputStream in:字節輸入流(把文件中保存的字節讀取出來)
可以傳入FileInputStream
String charsetName:編碼表名稱
可以傳入一個字符串格式的編碼表名稱,比如"GBK","utf-8"...,編碼表名稱不區分大小寫,如果不寫默認為系統碼表


使用步驟:
1.創建字節輸入流FileInputStream對象,綁定數據源
2.創建轉換流InputStreamReader對象,構造方法中,傳入FileInputStream和指定的編碼表名稱
3.使用InputStreamReader讀取數據的方法,讀取數據
4.釋放資源

★ 註意:構造方法中指定的編碼名稱,必須和要讀取的文件保持一致,否則會出現亂碼


【序列化流和反序列化流】

【對象的序列化:把對象以流的方式寫入到文件中保存】

●構造方法:
ObjectOutputStream(OutputStream out) 創建寫入指定OutputStream 的 ObjectOutputStream
參數:
OutputStream out: 字節流,可以傳入FileOutputStream.

使用步驟:
1.創建對象,並賦值
2.創建字節輸出流對象FileOutputStream,綁定數據目的地
3.創建序列化流ObjectOutputStream對象,構造方法中傳入FileOutputStream
4.使用ObjectOutputStream中的方法writeObject,把對象寫入到文件中
5.釋放資源
★註意:
要序列化的類如果沒有實現Serializable接口,會拋出NotSerializableException異常

【對象的反序列化:把文件中保存的對象,以流的方式讀取出來】

●構造方法:
ObjectInputStream(InputStream in)創建從指定InputStream 讀取的ObjectInputStream.
參數:
InputStream in :字節流,可以傳入FileInputStream

讀對象的方法:
返回值:Object readObject() 從ObjectInputStream讀取對象.

使用步驟:
1:創建字節輸入流FileInputStream,綁定數據源
2:創建反序列化流ObjectInputStream,構造方法中傳入FileInputStream
3.使用ObjectInputStream中的方法readObject,讀取文件中保存的對象
4.釋放資源
5.打印對象

★註意:
方法readObjec,會拋出ClassNotFoundException(沒有class文件異常)
反序列化的前提,必須有對象的class文件存在.


〓類通過實現java.io.Serializable接口以啟用其序列化功能.未實現此接口的類將無法使其任何狀態序列化或反序列化

Serializable接口:稱之為標記型接口
類只有實現了Serializable才能序列化和反序列化,不實現就不能

★序列化和反序列的是對象,如果對象中有靜態的屬性,可以序列化嗎?

靜態屬於類,不屬於對象,不能序列化
不管是靜態屬性和非靜態屬性都有默認值
如果是靜態屬性,不能被序列化,那麽就使用它的默認值

瞬態關鍵字 【 transient 】 :作用, 阻止成員變量序列化


【打印流】

字節打印流:PrintStream extends OutputStream
字符打印流:PrintWriter extends Writer

兩個打印流中的方法完全一致:
void print(Object obj) 輸出任意類型的數據
void println(Object obj) 輸出任意類型的數據,自動寫入換行操作

構造方法: 就是打印流的輸出目的端

PrintStream
構造方法目的地:接受File類型,接收字符串文件名,接收字節輸出流OutputStream
PrintWriter
構造方法目的地:接受File類型,接收字符串文件名,接收字節輸出流OutputStream

★註意事項:
字節流寫入數據的時候,會直接把數據寫入到文件中
字符流寫入數據的時候,會把數據寫入到內存緩沖區中,必須刷新或者關閉,才會把數據有緩沖區刷新到文件中


字符打印流的自動刷新功能:

1.字符打印劉的輸出的目的地必須是一個流對象(字符,字節)
2.字符打印流構造方法的參數autoFlush必須是true
3.必須使用 println、printf 或 format 方法中的一個才能實現

包含自動刷新的構造方法:

PrintWriter(OutputStream out, Boolean autoFlush)
PrintWriter(Writer out, boolean autoFlush)
我們可以把字符串的目的地和File類的目的地轉換為流,開啟自動刷新


【Properties類】

Properties集合 extends Hashtable implements Map 集合 所屬包:java.util.Properties

Properties集合的特點:
1:鍵和值默認都是String類型
2:集合中有自己特有的方法
返回值:Object SetProperty(String key,String value) 調用Hashtable的方法 put.
返回值:String getProperty(String key) 用指定的鍵在此屬性列表搜索屬性. 相當於Map集合中的get(Key k) 方法
返回值Set<String> StringPropertyNames() 返回此屬性列表中的鍵集 相當於Map集合中的keySet.

3:和IO流相結合的方法
使用store 方法把集合中保存的臨時數據,持久化到硬盤的文件中保存
返回值:void store(OutputStream out, String cpmments)
返回值:void store(Writer writer, String comments)
方法參數:
OutputStream out:不能操作中文
Writer writer:可以操作中文
String comments:註釋,保存數據的用途,可以寫null,不能寫中文,默認使用unicode編碼

使用步驟:
1.創建Properties集合,添加數據
2.創建字節輸出流或者字符輸出流對象,綁定目的地
3.使用Properties集合中的方法store把集合中的數據,寫入到文件中
4.釋放資源


使用load方法把硬盤文件中保存的鍵值對,讀取出來,放入到Properties集合中
返回值:void load(InputStream inStream)
返回值:void load(Reader reader)
方法的參數:
InputStream inStream:不能讀取包含中文的鍵值對
Reader reader: 可以讀取包含中文的鍵值對

使用步驟:
1.創建創建Properties集合
2.創建字節輸入流/字符輸入對象,綁定數據源
3.使用Properties中的方法load,讀取文件中保存的鍵值對,把鍵值對保存到集合中
4.釋放資源
5.遍歷Properties集合
★註意:
prop.properties文件中使用#號可以註釋一行
prop.properties文件中key和value默認就是字符不用使用""
prop.properties文件中key和value之間可以使用=連接也可以使用空格


【Commons-IO】

使用commons-IO中提供的工具類FileUtils
方法都是靜態的 static 可以通過類名直接使用 方法的參數都是File類型

readFileToString(File file):讀取文件內容,並返回一個String

writeStringToFile(File file ,String content): 將內容content寫入到file中;

copyFile(File srcFile, File destFile): 文件復制

copyDirectoryToDirectory(File srcDir , File destDir) 文件夾復制

我的學習之路_第十一章_字符流