Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場(chǎng)景
一、轉(zhuǎn)換流
轉(zhuǎn)換流屬于字符流,也是一種高級(jí)流,用來包裝Reader和Writer。轉(zhuǎn)化流是字符流和字節(jié)流之間的橋梁。轉(zhuǎn)換輸入流為InputStreamReader,把把字節(jié)流轉(zhuǎn)化為字符流;轉(zhuǎn)化輸出流為OutputStreamWriter,把字符流轉(zhuǎn)化為字節(jié)流。
應(yīng)用場(chǎng)景:字節(jié)流想要使用字符流中的方法則使用轉(zhuǎn)換流。
例如,使用轉(zhuǎn)換輸入流讀取文件:
一個(gè)ANSI編碼的文件:
public class MyApp { public static void main(String[] args) throws IOException { //1.創(chuàng)建對(duì)象并指定字符編碼讀取 InputStreamReader isr = new InputStreamReader(new FileInputStream("javase-learning\\src\\example\\org\\domain\\c(ANSI).txt"),"GBK"); //2.讀取數(shù)據(jù) int ch; while((ch = isr.read())!= -1){ System.out.println((char)ch); } //3.釋放資源 isr.close(); } }
上述這種寫法JDK11有了替代方案,使用FileReader,其實(shí)FileReader是InputStreamReader的子類。。
public class MyApp { public static void main(String[] args) throws IOException { //1.創(chuàng)建對(duì)象并指定字符編碼讀取 FileReader fr = new FileReader("javase-learning\\src\\example\\org\\domain\\c(ANSI).txt", Charset.forName("GBK")); //2.讀取數(shù)據(jù) int ch; while((ch = fr.read())!= -1){ System.out.println((char)ch); } //3.釋放資源 fr.close(); } }
再例如,使用轉(zhuǎn)化輸出流寫文件:
public class MyApp { public static void main(String[] args) throws IOException { //1.創(chuàng)建對(duì)象并指定字符編碼 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("javase-learning\\src\\example\\org\\domain\\d.txt"), "GBK"); //2.寫出數(shù)據(jù) osw.write("你好你好"); //3.釋放資源 osw.close(); } }
JDK11替代方案:
public class MyApp { public static void main(String[] args) throws IOException { //1.創(chuàng)建對(duì)象并指定字符編碼 FileWriter fw = new FileWriter("javase-learning\\src\\example\\org\\domain\\d.txt", Charset.forName("GBK")); //2.寫出數(shù)據(jù) fw.write("你好你好"); //3.釋放資源 fw.close(); } }
再例如,將本地文件的GBK文件轉(zhuǎn)為UTF-8文件:
注意:上述代碼運(yùn)行后d.txt的內(nèi)容與b.txt的內(nèi)容用記事本打開結(jié)果相同,且d.txt的編碼方式為UTF-8。
二、序列化流和反序列化流
序列化流(ObjectOutputStream,也稱對(duì)象操作輸出流)與反序列化流(ObjectInputStream,也稱對(duì)象操作輸入流)屬于字節(jié)流,也是高級(jí)流,是對(duì)基本流的包裝。
序列化流可以把java中的對(duì)象輸出到本地文件中。
說明:存儲(chǔ)java對(duì)象可以用基本流直接存儲(chǔ)屬性值,還能直接對(duì)文件進(jìn)行修改。而序列化流存儲(chǔ)java對(duì)象打開文件是看不懂的,而無法直接修改,這樣可以防止暫時(shí)存儲(chǔ)在文件中的數(shù)據(jù)被用戶修改。
(一)序列化流
構(gòu)造方法:
成員方法:
例如,新建一個(gè)User類:
注意:直接使用對(duì)象輸出流將對(duì)象保存到文件中會(huì)出現(xiàn)NotSerializableException異常,解決方法是讓JavaBean類實(shí)現(xiàn)Serializable接口。
注意:可以看出實(shí)現(xiàn)了Serializable接口不用重寫方法,因?yàn)镾erializable接口中沒有抽象方法,是標(biāo)記型接口,一旦實(shí)現(xiàn)了這個(gè)接口,就表示當(dāng)前的類可以被序列化。
編寫代碼實(shí)現(xiàn)序列化:
結(jié)果如下:
(二)反序列化流
注意:
如果將javabean對(duì)象通過序列化存入本地文件,如果這時(shí)修改javabean類,再去讀取原來存儲(chǔ)的javabean對(duì)象賦給修改后的類創(chuàng)建對(duì)象會(huì)報(bào)錯(cuò)。
為了防止報(bào)錯(cuò),可以在類中定義版本號(hào),這個(gè)版本號(hào)會(huì)存入通過序列化流存入的本地文件。
如果不想把某些屬性字段保存到本地文件中,可以在該屬性字段前加瞬態(tài)關(guān)鍵字transient。
再例如,運(yùn)用序列化流和反序列化流讀寫多個(gè)對(duì)象。
方式一(讀之前已知寫入了多少個(gè)對(duì)象):
方式二(讀之前不知道寫入了多少個(gè)對(duì)象):
補(bǔ)充:
三、打印流
java.io.PrintStream:打印流
PrintStream 為其他輸出流添加了功能,使它們能夠方便地打印各種數(shù)據(jù)值表示形式。
PrintStream特點(diǎn):
1.只負(fù)責(zé)數(shù)據(jù)的輸出,不負(fù)責(zé)數(shù)據(jù)的讀取
2.與其他輸出流不同,PrintStream 永遠(yuǎn)不會(huì)拋出 IOException
3.有特有的方法,print,println
void print(任意類型的值)
void println(任意類型的值并換行)
構(gòu)造方法:
PrintStream(File file):輸出的目的地是一個(gè)文件
PrintStream(OutputStream out):輸出的目的地是一個(gè)字節(jié)輸出流
PrintStream(String fileName) :輸出的目的地是一個(gè)文件路徑
PrintStream extends OutputStream
繼承自父類的成員方法:
- public void close() :關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。
- public void flush() :刷新此輸出流并強(qiáng)制任何緩沖的輸出字節(jié)被寫出。
- public void write(byte[] b):將 b.length字節(jié)從指定的字節(jié)數(shù)組寫入此輸出流。
- public void write(byte[] b, int off, int len) :從指定的字節(jié)數(shù)組寫入 len字節(jié),從偏移量 off開始輸出到此輸出流。
- public abstract void write(int b) :將指定的字節(jié)輸出流。
注意:
如果使用繼承自父類的write方法寫數(shù)據(jù),那么查看數(shù)據(jù)的時(shí)候會(huì)查詢編碼表 97->a
如果使用自己特有的方法print/println方法寫數(shù)據(jù),寫的數(shù)據(jù)原樣輸出 97->97
可以改變輸出語句的目的地(打印流的流向)
輸出語句,默認(rèn)在控制臺(tái)輸出
使用System.setOut方法改變輸出語句的目的地改為參數(shù)中傳遞的打印流的目的地
static void setOut(PrintStream out)
重新分配“標(biāo)準(zhǔn)”輸出流。
到此這篇關(guān)于Java中的轉(zhuǎn)換流、壓縮流、序列化流、打印流及應(yīng)用場(chǎng)景的文章就介紹到這了,更多相關(guān)java轉(zhuǎn)換流、壓縮流、序列化流、打印流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解
這篇文章主要介紹了SpringMVC中的DispatcherServlet結(jié)構(gòu)和初始化詳解,SpringMVC中Spring容器的關(guān)系是通過監(jiān)聽方式啟動(dòng)的,那么Spring與Servlet的Web容器(如:Tomcat、jetty)的關(guān)系則是通過DispatcherServlet進(jìn)行關(guān)聯(lián),需要的朋友可以參考下2024-01-01Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議
這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05windows?java?-jar無法啟動(dòng)jar包簡(jiǎn)單的解決方法
這篇文章主要介紹了windows?java?-jar無法啟動(dòng)jar包簡(jiǎn)單的解決方法,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-12-12java中對(duì)象轉(zhuǎn)json字符串的三種常用方式
本文主要介紹了java中對(duì)象轉(zhuǎn)json字符串的三種常用方式,包含Jackson庫,Gson庫和Hutool工具類這三種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06Java yield()線程讓步實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java yield()線程讓步實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java對(duì)List進(jìn)行排序的兩種實(shí)現(xiàn)方法,第一種是實(shí)體類自己實(shí)現(xiàn)比較,第二種是借助比較器進(jìn)行排序,下面開一起看看詳細(xì)的介紹吧,有需要的朋友們可以參考借鑒。2016-12-12SpringBoot+Redis實(shí)現(xiàn)不重復(fù)消費(fèi)的隊(duì)列的示例代碼
本文主要介紹了SpringBoot+Redis實(shí)現(xiàn)不重復(fù)消費(fèi)的隊(duì)列的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07