日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

前言
io流用到的地方很多,就比如上傳下載,傳輸,設(shè)計(jì)模式等....基礎(chǔ)打扎實(shí)了,才能玩更高端的。

在博主認(rèn)為真正懂IO流的優(yōu)秀程序員每次在使用IO流之前都會(huì)明確分析如下四點(diǎn):

(1)明確要操作的數(shù)據(jù)是數(shù)據(jù)源還是數(shù)據(jù)目的(也就是要讀還是要寫)
(2)明確要操作的設(shè)備上的數(shù)據(jù)是字節(jié)還是文本
(3)明確數(shù)據(jù)所在的具體設(shè)備
(4)明確是否需要額外功能(比如是否需要轉(zhuǎn)換流、高效流等)

以上四點(diǎn)將會(huì)在文章告白IO流的四點(diǎn)明確里面小結(jié)一下,如果各位真能熟練以上四點(diǎn),我覺得這篇文章你就沒必要看了,因?yàn)槟阋呀?jīng)把IO玩弄與股掌之中,萬物皆可被你盤也就也不再話下了。

@

1、告白IO流的四點(diǎn)明確

(1)明確要操作的數(shù)據(jù)是數(shù)據(jù)源還是數(shù)據(jù)目的(要讀還是要寫)

源:
InputStream Reader

目的:
OutputStream Writer

(2)明確要操作的設(shè)備上的數(shù)據(jù)是字節(jié)還是文本

源:

字節(jié): InputStream

文本: Reader

目的:

字節(jié): OutputStream

文本: Writer

(3)明確數(shù)據(jù)所在的具體設(shè)備

源設(shè)備:

硬盤:文件 File開頭

內(nèi)存:數(shù)組,字符串

鍵盤:System.in

網(wǎng)絡(luò):Socket

對(duì)應(yīng)目的設(shè)備:

硬盤:文件 File開頭

內(nèi)存:數(shù)組,字符串

屏幕:System.out

網(wǎng)絡(luò):Socket

(4)明確是否需要額外功能

需要轉(zhuǎn)換—— 轉(zhuǎn)換流 InputStreamReader 、OutputStreamWriter

需要高效—— 緩沖流Bufferedxxx

多個(gè)源—— 序列流 SequenceInputStream

對(duì)象序列化—— ObjectInputStream、ObjectOutputStream

保證數(shù)據(jù)的輸出形式—— 打印流PrintStream 、Printwriter

操作基本數(shù)據(jù),保證字節(jié)原樣性——DataOutputStream、DataInputStream

到這里,我們?cè)賮砜纯碔O流的分類吧
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


OK,準(zhǔn)備好了告白IO流了咩?

2、File類

至于IO流,也就是輸入輸出流,從文件出發(fā)到文件結(jié)束,至始至終都離不開文件,所以IO流還得從文件File類講起。

1.1 File概述

JAVA.io.File 類是專門對(duì)文件進(jìn)行操作的類,只能對(duì)文件本身進(jìn)行操作,不能對(duì)文件內(nèi)容進(jìn)行操作。
java.io.File 類是文件和目錄路徑名的抽象表示,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作。

怎么理解上面兩句話?其實(shí)很簡(jiǎn)單!

第一句就是說File跟流無關(guān),F(xiàn)ile類不能對(duì)文件進(jìn)行讀和寫也就是輸入和輸出!
第二句就是說File主要表示類似D:\文件目錄1與D:\文件目錄1\文件.txt,前者是文件夾(Directory)后者則是文件(file),而File類就是操作這兩者的類。

1.2 構(gòu)造方法

在java中,一切皆是對(duì)象,F(xiàn)ile類也不例外,不論是哪個(gè)對(duì)象都應(yīng)該從該對(duì)象的構(gòu)造說起,所以博主來分析分析File類的構(gòu)造方法。首先從API開始著手
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


我們主要來學(xué)習(xí)一下比較常用的三個(gè):

1、 public File(String pathname) :通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實(shí)例。
2、 public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。
3、 public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例。

看字描述不夠生動(dòng)不夠形象不得勁?沒得事,下面進(jìn)行構(gòu)造舉例,馬上就生動(dòng)形象了,代碼如下:

File類的注意點(diǎn):

一個(gè)File對(duì)象代表硬盤中實(shí)際存在的一個(gè)文件或者目錄。File類構(gòu)造方法不會(huì)給你檢驗(yàn)這個(gè)文件或文件夾是否真實(shí)存在,因此無論該路徑下是否存在文件或者目錄,都不影響File對(duì)象的創(chuàng)建。

1.3 常用方法

File的常用方法主要分為獲取功能、獲取絕對(duì)路徑和相對(duì)路徑、判斷功能、創(chuàng)建刪除功能的方法

1.3.1 獲取功能的方法

1、public String getAbsolutePath() :返回此File的絕對(duì)路徑名字符串。

2、public String getPath() :將此File轉(zhuǎn)換為路徑名字符串。

3、public String getName() :返回由此File表示的文件或目錄的名稱。

4、public long length() :返回由此File表示的文件的長(zhǎng)度。

以上方法測(cè)試,代碼如下【注意測(cè)試以自己的電腦文件夾為準(zhǔn)】:

注意:length(),表示文件的長(zhǎng)度。但是File對(duì)象表示目錄,則返回值未指定。

1.3.2 絕對(duì)路徑和相對(duì)路徑

絕對(duì)路徑:一個(gè)完整的路徑,以盤符開頭,例如F://aaa.txt。
相對(duì)路徑:一個(gè)簡(jiǎn)化的路徑,不以盤符開頭,例如//aaa.txt//b.txt。

1、路徑是不區(qū)分大小寫
2、路徑中的文件名稱分隔符windows使用反斜杠,反斜杠是轉(zhuǎn)義字符,兩個(gè)反斜杠代表一個(gè)普通的反斜杠

1.3.3判斷功能的方法

1、 public boolean exists() :此File表示的文件或目錄是否實(shí)際存在。
2、 public boolean isDirectory() :此File表示的是否為目錄。
3、public boolean isFile() :此File表示的是否為文件。

方法演示,代碼如下:

1.3.4 創(chuàng)建刪除功能的方法

  • public boolean createNewFile() :文件不存在,創(chuàng)建一個(gè)新的空文件并返回true,文件存在,不創(chuàng)建文件并返回false。
  • public boolean delete() :刪除由此File表示的文件或目錄。
  • public boolean mkdir() :創(chuàng)建由此File表示的目錄。
  • public boolean mkdirs() :創(chuàng)建由此File表示的目錄,包括任何必需但不存在的父目錄。

其中,mkdirs()和mkdir()方法類似,但mkdir(),只能創(chuàng)建一級(jí)目錄,mkdirs()可以創(chuàng)建多級(jí)目錄比如//a//b//c,所以開發(fā)中一般用mkdirs();

這些方法中值得注意的是createNewFile方法以及mkdirmkdirs的區(qū)別

方法測(cè)試,代碼如下:

注意:delete方法,如果此File表示目錄,則目錄必須為空才能刪除。

1.4 目錄的遍歷

  • public String[] list() :返回一個(gè)String數(shù)組,表示該File目錄中的所有子文件或目錄。
  • public File[] listFiles() :返回一個(gè)File數(shù)組,表示該File目錄中的所有的子文件或目錄。
史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


listFiles在獲取指定目錄下的文件或者文件夾時(shí)必須滿足下面兩個(gè)條件

1,指定的目錄必須存在

2,指定的必須是目錄。否則容易引發(fā)返回?cái)?shù)組為null,出現(xiàn)NullPointerException異常

1.5 遞歸遍歷文件夾下所有文件以及子文件

不說啥了,直接上代碼:

如果對(duì)上面的代碼有疑問,可以隨時(shí)聯(lián)系我,博主一直都在!

3、初探IO流

1.1 什么是IO

我想在座各位肯定經(jīng)歷都過這樣的場(chǎng)景。當(dāng)你編輯一個(gè)文本文件也好用eclipse打代碼也罷,忘記了ctrl+s ,在你關(guān)閉文件的哪一瞬間手殘點(diǎn)了個(gè)不該點(diǎn)的按鈕,但你反應(yīng)過來,心早已拔涼拔涼的了。

我們把這種數(shù)據(jù)的傳輸,可以看做是一種數(shù)據(jù)的流動(dòng),按照流動(dòng)的方向,以內(nèi)存為基準(zhǔn),分為輸入input 和輸出output ,即流向內(nèi)存是輸入流,流出內(nèi)存的輸出流。

Java中I/O操作主要是指使用java.io包下的內(nèi)容,進(jìn)行輸入、輸出操作。輸入也叫做讀取數(shù)據(jù),輸出也叫做作寫出數(shù)據(jù)

1.2 IO的分類

根據(jù)數(shù)據(jù)的流向分為:輸入流 和 輸出流

  • 輸入流 :把數(shù)據(jù)從其他設(shè)備上讀取到內(nèi)存中的流。
  • 輸出流 :把數(shù)據(jù)從內(nèi)存 中寫出到其他設(shè)備上的流。

根據(jù)數(shù)據(jù)的類型分為:字節(jié)流 和 字符流

  • 字節(jié)流 :以字節(jié)為單位,讀寫數(shù)據(jù)的流。
  • 字符流 :以字符為單位,讀寫數(shù)據(jù)的流。

分類之后對(duì)應(yīng)的超類(V8提示:超類也就是父類的意思)
| | 輸入流 | 輸出流
|--|--|--|
| 字節(jié)流 | 字節(jié)輸入流 InputStream |字節(jié)輸出流 OutputStream |
| 字符流 | 字符輸入流 Reader|字符輸出流 Writer|

注:
由這四個(gè)類的子類名稱基本都是以其父類名作為子類名的后綴。
如:InputStream的子類FileInputStream。
如:Reader的子類FileReader。

 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

1.3 關(guān)于IO的分流向說明

啥都不說了,看圖吧
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

字節(jié)流OutputStream與InputStream的故事

OutputStream與InputStream的繼承關(guān)系
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

2.1 文件的世界里一切皆為字節(jié)

我們必須明確一點(diǎn)的是,一切文件數(shù)據(jù)(文本、圖片、視頻等)在存儲(chǔ)時(shí),都是以二進(jìn)制數(shù)字的形式保存,都一個(gè)一個(gè)的字節(jié),那么傳輸時(shí)一樣如此。所以,字節(jié)流可以傳輸任意文件數(shù)據(jù)。在操作流的時(shí)候,我們要時(shí)刻明確,無論使用什么樣的流對(duì)象,底層傳輸?shù)氖冀K為二進(jìn)制數(shù)據(jù)。

2.2 字節(jié)輸出流(OutputStream)

java.io.OutputStream抽象類是表示字節(jié)輸出流的所有類的超類(父類),將指定的字節(jié)信息寫出到目的地。它定義了字節(jié)輸出流的基本共性功能方法,不要問我OutputStream為啥可以定義字節(jié)輸出流的基本共性功能方法,熊dei啊,上一句說過了OutputStream是字節(jié)輸出流的所有類的超類,繼承知識(shí),懂?(如果是真的不理解的小白同學(xué),可以點(diǎn)擊藍(lán)色字體繼承進(jìn)入補(bǔ)習(xí))

字節(jié)輸出流的基本共性功能方法:

1、 public void close() :關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。
2、 public void flush() :刷新此輸出流并強(qiáng)制任何緩沖的輸出字節(jié)被寫出。
3、 public void write(byte[] b):將 b.length個(gè)字節(jié)從指定的字節(jié)數(shù)組寫入此輸出流。
4、 public void write(byte[] b, int off, int len) :從指定的字節(jié)數(shù)組寫入 len字節(jié),從偏移量 off開始輸出到此輸出流。 也就是說從off個(gè)字節(jié)數(shù)開始讀取一直到len個(gè)字節(jié)結(jié)束
5、 public abstract void write(int b) :將指定的字節(jié)輸出流。

以上五個(gè)方法則是字節(jié)輸出流都具有的方法,由父類OutputStream定義提供,子類都會(huì)共享以上方法

FileOutputStream類

OutputStream有很多子類,我們從最簡(jiǎn)單的一個(gè)子類FileOutputStream開始。看名字就知道是文件輸出流,用于將數(shù)據(jù)寫出到文件。

FileOutputStream構(gòu)造方法

不管學(xué)啥子,只有是對(duì)象,就從構(gòu)造方法開始!

1、 public FileOutputStream(File file):根據(jù)File對(duì)象為參數(shù)創(chuàng)建對(duì)象。 
2、 public FileOutputStream(String name): 根據(jù)名稱字符串為參數(shù)創(chuàng)建對(duì)象。

推薦第二種構(gòu)造方法【開發(fā)常用】:

就以上面這句代碼來講,類似這樣創(chuàng)建字節(jié)輸出流對(duì)象都做了三件事情
1、調(diào)用系統(tǒng)功能去創(chuàng)建文件【輸出流對(duì)象才會(huì)自動(dòng)創(chuàng)建】
2、創(chuàng)建outputStream對(duì)象
3、把foutputStream對(duì)象指向這個(gè)文件

注意:
創(chuàng)建輸出流對(duì)象的時(shí)候,系統(tǒng)會(huì)自動(dòng)去對(duì)應(yīng)位置創(chuàng)建對(duì)應(yīng)文件,而創(chuàng)建輸出流對(duì)象的時(shí)候,文件不存在則會(huì)報(bào)FileNotFoundException異常,也就是系統(tǒng)找不到指定的文件異常。

當(dāng)你創(chuàng)建一個(gè)流對(duì)象時(shí),必須直接或者間接傳入一個(gè)文件路徑。比如現(xiàn)在我們創(chuàng)建一個(gè)FileOutputStream流對(duì)象,在該路徑下,如果沒有這個(gè)文件,會(huì)創(chuàng)建該文件。如果有這個(gè)文件,會(huì)清空這個(gè)文件的數(shù)據(jù)。有興趣的童鞋可以測(cè)試一下,具體代碼如下:

FileOutputStream寫出字節(jié)數(shù)據(jù)

使用FileOutputStream寫出字節(jié)數(shù)據(jù)主要通過Write方法,而write方法分如下三種

  1. 寫出字節(jié):write(int b) 方法,每次可以寫出一個(gè)字節(jié)數(shù)據(jù),代碼如下:

雖然參數(shù)為int類型四個(gè)字節(jié),但是只會(huì)保留一個(gè)字節(jié)的信息寫出。流操作完畢后,必須釋放系統(tǒng)資源,調(diào)用close方法,千萬記得。

  1. 寫出字節(jié)數(shù)組:write(byte[] b),每次可以寫出數(shù)組中的數(shù)據(jù),代碼使用演示:
  1. 寫出指定長(zhǎng)度字節(jié)數(shù)組:write(byte[] b, int off, int len) ,每次寫出從off索引開始,len個(gè)字節(jié),代碼如下:

FileOutputStream實(shí)現(xiàn)數(shù)據(jù)追加續(xù)寫、換行

經(jīng)過以上的代碼測(cè)試,每次程序運(yùn)行,每次創(chuàng)建輸出流對(duì)象,都會(huì)清空目標(biāo)文件中的數(shù)據(jù)。如何保留目標(biāo)文件中數(shù)據(jù),還能繼續(xù)追加新數(shù)據(jù)呢?并且實(shí)現(xiàn)換行呢?其實(shí)很簡(jiǎn)單,這個(gè)時(shí)候我們又要再學(xué)習(xí)FileOutputStream的另外兩個(gè)構(gòu)造方法了,如下:

1、public FileOutputStream(File file, boolean Append)

2、public FileOutputStream(String name, boolean append)

這兩個(gè)構(gòu)造方法,第二個(gè)參數(shù)中都需要傳入一個(gè)boolean類型的值,true 表示追加數(shù)據(jù),false 表示不追加也就是清空原有數(shù)據(jù)。這樣創(chuàng)建的輸出流對(duì)象,就可以指定是否追加續(xù)寫了,至于Windows換行則是 nr ,下面將會(huì)詳細(xì)講到。

實(shí)現(xiàn)數(shù)據(jù)追加續(xù)寫代碼如下:

Windows系統(tǒng)里,換行符號(hào)是rn ,具體代碼如下:

回車符r和換行符n :回車符:回到一行的開頭(return)。換行符:下一行(newline)。系統(tǒng)中的換行:Windows系統(tǒng)里,每行結(jié)尾是 回車+換行 ,即rn;Unix系統(tǒng)里,每行結(jié)尾只有 換行 ,即n;mac系統(tǒng)里,每行結(jié)尾是 回車 ,即r。從 Mac OS X開始與linux統(tǒng)一。

2.3 字節(jié)輸入流(InputStream)

java.io.InputStream抽象類是表示字節(jié)輸入流的所有類的超類(父類),可以讀取字節(jié)信息到內(nèi)存中。它定義了字節(jié)輸入流的基本共性功能方法。

字節(jié)輸入流的基本共性功能方法:

1、 public void close() :關(guān)閉此輸入流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。
2、public abstract int read(): 從輸入流讀取數(shù)據(jù)的下一個(gè)字節(jié)。

3、 public int read(byte[] b): 該方法返回的int值代表的是讀取了多少個(gè)字節(jié),讀到幾個(gè)返回幾個(gè),讀取不到返回-1

FileInputStream類

java.io.FileInputStream類是文件輸入流,從文件中讀取字節(jié)。

FileInputStream的構(gòu)造方法

1、 FileInputStream(File file): 通過打開與實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream ,該文件由文件系統(tǒng)中的 File對(duì)象 file命名。
2、 FileInputStream(String name): 通過打開與實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream ,該文件由文件系統(tǒng)中的路徑名name命名。

同樣的,推薦使用第二種構(gòu)造方法:

當(dāng)你創(chuàng)建一個(gè)流對(duì)象時(shí),必須傳入一個(gè)文件路徑。該路徑下,如果沒有該文件,會(huì)拋出FileNotFoundException 。

構(gòu)造舉例,代碼如下:

FileInputStream讀取字節(jié)數(shù)據(jù)

  1. 讀取字節(jié):read方法,每次可以讀取一個(gè)字節(jié)的數(shù)據(jù),提升為int類型,讀取到文件末尾,返回-1,代碼測(cè)試如下【read.txt文件中內(nèi)容為abcde】:

循環(huán)改進(jìn)讀取方式,代碼使用演示:

  1. 使用字節(jié)數(shù)組讀取:read(byte[] b),每次讀取b的長(zhǎng)度個(gè)字節(jié)到數(shù)組中,返回讀取到的有效字節(jié)個(gè)數(shù),讀取到末尾時(shí),返回-1 ,代碼使用演示:

由于read.txt文件中內(nèi)容為abcde,而錯(cuò)誤數(shù)據(jù)d,是由于最后一次讀取時(shí),只讀取一個(gè)字節(jié)e,數(shù)組中,上次讀取的數(shù)據(jù)沒有被完全替換【注意是替換,看下圖】,所以要通過len ,獲取有效的字節(jié)
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


代碼如下:

在開發(fā)中一般強(qiáng)烈推薦使用數(shù)組讀取文件,代碼如下:

字節(jié)流FileInputstream復(fù)制圖片

復(fù)制圖片原理
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

代碼實(shí)現(xiàn)

復(fù)制圖片文件,代碼如下:

復(fù)制文本、圖片、mp3、視頻等的方式一樣

到這里,已經(jīng)從File類講到了字節(jié)流OutputStream與InputStream,而現(xiàn)在將主要從字符流Reader和Writer的故事開展。

字符流Reader和Writer的故事

字符流Reader和Writer的故事從它們的繼承圖開始,啥都不說了,直接看圖
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

字符流

字符流的由來:因?yàn)閿?shù)據(jù)編碼的不同,因而有了對(duì)字符進(jìn)行高效操作的流對(duì)象,字符流本質(zhì)其實(shí)就是基于字節(jié)流讀取時(shí),去查了指定的碼表,而字節(jié)流直接讀取數(shù)據(jù)會(huì)有亂碼的問題(讀中文會(huì)亂碼),這個(gè)時(shí)候小白同學(xué)就看不懂了,沒事,咋們先來看個(gè)程序:

具體現(xiàn)狀分析
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


話說,就是你哥我敢摸si,那你哥我肯定也不認(rèn)識(shí)這玩意啊: ??¥??¢????±

字節(jié)流讀取中文字符時(shí),可能不會(huì)顯示完整的字符,那是因?yàn)橐粋€(gè)中文字符占用多個(gè)字節(jié)存儲(chǔ)。

那字節(jié)流就沒辦法了嗎?不,字節(jié)流依舊有辦法,只是麻煩了點(diǎn),代碼如下:

這是為啥呢?沒錯(cuò)解碼的正是String,查看new String()的源碼,String構(gòu)造方法有解碼功能,并且默認(rèn)編碼是utf-8,代碼如下:

盡管字節(jié)流也能有辦法決絕亂碼問題,但是還是比較麻煩,于是java就有了字符流,字符為單位讀寫數(shù)據(jù),字符流專門用于處理文本文件。如果處理純文本的數(shù)據(jù)優(yōu)先考慮字符流,其他情況就只能用字節(jié)流了(圖片、視頻、等等只文本例外)。

從另一角度來說:字符流 = 字節(jié)流 + 編碼表

1、 字符輸入流(Reader)

java.io.Reader抽象類是字符輸入流的所有類的超類(父類),可以讀取字符信息到內(nèi)存中。它定義了字符輸入流的基本共性功能方法。

字符輸入流的共性方法

1、public void close() :關(guān)閉此流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。
2、 public int read(): 從輸入流讀取一個(gè)字符。
3、 public int read(char[] cbuf): 從輸入流中讀取一些字符,并將它們存儲(chǔ)到字符數(shù)組 cbuf中

FileReader類

java.io.FileReader類是讀取字符文件的便利類。構(gòu)造時(shí)使用系統(tǒng)默認(rèn)的字符編碼和默認(rèn)字節(jié)緩沖區(qū)。

構(gòu)造方法

1、FileReader(File file): 創(chuàng)建一個(gè)新的 FileReader ,給定要讀取的File對(duì)象
2、 FileReader(String fileName): 創(chuàng)建一個(gè)新的 FileReader ,給定要讀取的文件的字符串名稱

構(gòu)造方法的使用就算不寫應(yīng)該都很熟悉了吧,代碼如下:

FileReader讀取字符數(shù)據(jù)

  1. 讀取字符:read方法,每次可以讀取一個(gè)字符的數(shù)據(jù),提升為int類型,讀取到文件末尾,返回-1,循環(huán)讀取,代碼使用演示:

至于讀取的寫法類似字節(jié)流的寫法,只是讀取單位不同罷了。

2、字符輸出流(Writer)

java.io.Writer抽象類是字符輸出流的所有類的超類(父類),將指定的字符信息寫出到目的地。它同樣定義了字符輸出流的基本共性功能方法。

字符輸出流的基本共性功能方法

1、void write(int c) 寫入單個(gè)字符。
2、void write(char[] cbuf)寫入字符數(shù)組。
3、 abstract void write(char[] cbuf, int off, int len)寫入字符數(shù)組的某一部分,off數(shù)組的開始索引,len寫的字符個(gè)數(shù)。
4、 void write(String str)寫入字符串。
5、void write(String str, int off, int len) 寫入字符串的某一部分,off字符串的開始索引,len寫的字符個(gè)數(shù)。
6、void flush()刷新該流的緩沖。
7、void close() 關(guān)閉此流,但要先刷新它。

FileWriter類

java.io.FileWriter類是寫出字符到文件的便利類。構(gòu)造時(shí)使用系統(tǒng)默認(rèn)的字符編碼和默認(rèn)字節(jié)緩沖區(qū)。

構(gòu)造方法

1、 FileWriter(File file): 創(chuàng)建一個(gè)新的 FileWriter,給定要讀取的File對(duì)象。
2、FileWriter(String fileName): 創(chuàng)建一個(gè)新的 FileWriter,給定要讀取的文件的名稱。

依舊是熟悉的構(gòu)造舉例,代碼如下:

FileWriter寫出數(shù)據(jù)

寫出字符:write(int b) 方法,每次可以寫出一個(gè)字符數(shù)據(jù),代碼使用演示:

【注意】關(guān)閉資源時(shí),與FileOutputStream不同。 如果不關(guān)閉,數(shù)據(jù)只是保存到緩沖區(qū),并未保存到文件。

關(guān)閉close和刷新flush

因?yàn)閮?nèi)置緩沖區(qū)的原因,如果不關(guān)閉輸出流,無法寫出字符到文件中。但是關(guān)閉的流對(duì)象,是無法繼續(xù)寫出數(shù)據(jù)的。如果我們既想寫出數(shù)據(jù),又想繼續(xù)使用流,就需要flush 方法了。

flush :刷新緩沖區(qū),流對(duì)象可以繼續(xù)使用。
close:先刷新緩沖區(qū),然后通知系統(tǒng)釋放資源。流對(duì)象不可以再被使用了。

flush還是比較有趣的,童鞋們不自己運(yùn)行一下還真不好體會(huì),現(xiàn)在博主就寫個(gè)程序讓你體會(huì)體會(huì):
字符流

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


運(yùn)行效果是怎么樣的呢?答案是b.txt文件中依舊是空的,是的并沒有任何東西,為啥呢?熊dei啊,我在上面就用紅色字體特別標(biāo)注過了,就是這句話: 【注意】關(guān)閉資源時(shí),與FileOutputStream不同。 如果不關(guān)閉,數(shù)據(jù)只是保存到緩沖區(qū),并未保存到文件。這個(gè)時(shí)候反應(yīng)過來了吧,可見實(shí)踐例子的重要性,編程就是這樣,不去敲,永遠(yuǎn)學(xué)不會(huì)!!!所以一定要去敲,博主沒敲過10萬行代碼真的沒有臉出去說自己是學(xué)java的。所以,大家一定要多思考,多敲啊!!!

所以,我們?cè)谝陨系拇a中再添加下面三句代碼,就完美了,b.txt文件就能復(fù)制到源文件的數(shù)據(jù)了!

flush()這個(gè)函數(shù)是清空的意思,用于清空緩沖區(qū)的數(shù)據(jù)流,進(jìn)行流的操作時(shí),數(shù)據(jù)先被讀到內(nèi)存中,然后再用數(shù)據(jù)寫到文件中,那么當(dāng)你數(shù)據(jù)讀完時(shí),我們?nèi)绻@時(shí)調(diào)用close()方法關(guān)閉讀寫流,這時(shí)就可能造成數(shù)據(jù)丟失,為什么呢?因?yàn)椋x入數(shù)據(jù)完成時(shí)不代表寫入數(shù)據(jù)完成,一部分?jǐn)?shù)據(jù)可能會(huì)留在緩存區(qū)中,這個(gè)時(shí)候flush()方法就格外重要了。

好了,接下來close使用代碼如下:

即便是flush方法寫出了數(shù)據(jù),操作的最后還是要調(diào)用close方法,釋放系統(tǒng)資源。

FileWriter的續(xù)寫和換行

續(xù)寫和換行:操作類似于FileOutputStream操作(上一篇博客講到過),直接上代碼:

FileReader和FileWriter類完成文本文件復(fù)制

直接上代碼:

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

最后再次強(qiáng)調(diào):
字符流,只能操作文本文件,不能操作圖片,視頻等非文本文件。當(dāng)我們單純讀或者寫文本文件時(shí) 使用字符流 其他情況使用字節(jié)流

IO異常的處理

我們?cè)趯W(xué)習(xí)的過程中可能習(xí)慣把異常拋出,而實(shí)際開發(fā)中并不能這樣處理,建議使用try...catch...finally 代碼塊,處理異常部分,格式代碼如下:

如果對(duì)異常不是特別熟練的童鞋可以參考這篇文章【java基礎(chǔ)之異常】死了都要try,不淋漓盡致地catch我不痛快!

好了,到這里,字符流Reader和Writer的故事的到這里了!

前面主要寫了一些基本的流作為IO流的入門。從這里開始將要見識(shí)一些更強(qiáng)大的流。比如能夠高效讀寫的緩沖流,能夠轉(zhuǎn)換編碼的轉(zhuǎn)換流,能夠持久化存儲(chǔ)對(duì)象的序列化流等等,而這些強(qiáng)大的流都是在基本的流對(duì)象基礎(chǔ)之上而來的!這些強(qiáng)大的流將伴隨著我們今后的開發(fā)!

1、緩沖流【掌握】

1.1 簡(jiǎn)要概述

首先我們來認(rèn)識(shí)認(rèn)識(shí)一下緩沖流,也叫高效流,是對(duì)4個(gè)FileXxx 流的“增強(qiáng)流”。

緩沖流的基本原理

1、使用了底層流對(duì)象從具體設(shè)備上獲取數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)到緩沖區(qū)的數(shù)組內(nèi)。
2、通過緩沖區(qū)的read()方法從緩沖區(qū)獲取具體的字符數(shù)據(jù),這樣就提高了效率。
3、如果用read方法讀取字符數(shù)據(jù),并存儲(chǔ)到另一個(gè)容器中,直到讀取到了換行符時(shí),將另一個(gè)容器臨時(shí)存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)成字符串返回,就形成了readLine()功能。

也就是說在創(chuàng)建流對(duì)象時(shí),會(huì)創(chuàng)建一個(gè)內(nèi)置的默認(rèn)大小的緩沖區(qū)數(shù)組,通過緩沖區(qū)讀寫,減少系統(tǒng)IO次數(shù),從而提高讀寫的效率。

緩沖書寫格式為BufferedXxx,按照數(shù)據(jù)類型分類:

  • 字節(jié)緩沖流:BufferedInputStream,BufferedOutputStream
  • 字符緩沖流:BufferedReader,BufferedWriter

1.2 字節(jié)緩沖流

構(gòu)造方法

  • public BufferedInputStream(InputStream in) :創(chuàng)建一個(gè)新的緩沖輸入流,注意參數(shù)類型為InputStream
  • public BufferedOutputStream(OutputStream out): 創(chuàng)建一個(gè)新的緩沖輸出流,注意參數(shù)類型為OutputStream

構(gòu)造舉例代碼如下:

感受緩沖流的高效

緩沖流讀寫方法與基本的流是一致的,我們通過復(fù)制370多MB的大文件,測(cè)試它的效率。

  1. 基本流,代碼如下:
  1. 緩沖流,代碼如下:

有的童鞋就要說了,我要更快的速度!最近看速度與激情7有點(diǎn)上頭,能不能再快些?答案是當(dāng)然可以

想要更快可以使用數(shù)組的方式,代碼如下:

1.3 字符緩沖流

構(gòu)造方法

相同的來看看其構(gòu)造,其格式以及原理和字節(jié)緩沖流是一樣一樣的!

  • public BufferedReader(Reader in) :創(chuàng)建一個(gè)新的緩沖輸入流,注意參數(shù)類型為Reader
  • public BufferedWriter(Writer out): 創(chuàng)建一個(gè)新的緩沖輸出流,注意參數(shù)類型為Writer

構(gòu)造舉例,代碼如下:

字符緩沖流特有方法

字符緩沖流的基本方法與普通字符流調(diào)用方式一致,這里不再闡述,我們來看字符緩沖流具備的特有方法。

  • BufferedReader:public String readLine(): 讀一行數(shù)據(jù)。 讀取到最后返回null
  • BufferedWriter:public void newLine(): 換行,由系統(tǒng)屬性定義符號(hào)。

readLine方法演示代碼如下:

newLine方法演示代碼如下:

1.4 字符緩沖流練習(xí)

字符緩沖流練習(xí)啥捏?先放松一下吧各位,先欣賞欣賞我寫的下面的詩篇

6.你說你的程序叫簡(jiǎn)單,我說我的代碼叫詩篇
1.一想到你我就哦豁豁豁豁豁豁豁豁豁豁....哦nima個(gè)頭啊,完全不理人家受得了受不了
8.Just 簡(jiǎn)單你和我 ,Just 簡(jiǎn)單程序員
3.約了地點(diǎn)卻忘了見面 ,懂得寂寞才明白浩瀚
5.沉默是最大的發(fā)言權(quán)
2.總是喜歡坐在電腦前, 總是喜歡工作到很晚
7.向左走 又向右走,我們轉(zhuǎn)了好多的彎
4.你從來就不問我,你還是不是那個(gè)程序員

欣賞完了咩?沒錯(cuò)咋們就練習(xí)如何使用緩沖流的技術(shù)把上面的詩篇?dú)w順序,都編過號(hào)了~就是前面的1到8的編號(hào)~

分析:首先用字符輸入緩沖流創(chuàng)建個(gè)源,里面放沒有排過序的文字,之后用字符輸出緩沖流創(chuàng)建個(gè)目標(biāo)接收,排序的過程就要自己寫方法了哦,可以從每條詩詞的共同點(diǎn)“.”符號(hào)下手!

代碼實(shí)現(xiàn)

運(yùn)行效果

2、轉(zhuǎn)換流【掌握】

何謂轉(zhuǎn)換流?為何由來?暫時(shí)帶著問題讓我們先來了解了解字符編碼和字符集!
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

2.1 字符編碼與解碼

眾所周知,計(jì)算機(jī)中儲(chǔ)存的信息都是用二進(jìn)制數(shù)表示的,而我們?cè)谄聊簧峡吹降臄?shù)字、英文、標(biāo)點(diǎn)符號(hào)、漢字等字符是二進(jìn)制數(shù)轉(zhuǎn)換之后的結(jié)果。按照某種規(guī)則,將字符存儲(chǔ)到計(jì)算機(jī)中,稱為編碼 。反之,將存儲(chǔ)在計(jì)算機(jī)中的二進(jìn)制數(shù)按照某種規(guī)則解析顯示出來,稱為解碼。比如說,按照A規(guī)則存儲(chǔ),同樣按照A規(guī)則解析,那么就能顯示正確的文本符號(hào)。反之,按照A規(guī)則存儲(chǔ),再按照B規(guī)則解析,就會(huì)導(dǎo)致亂碼現(xiàn)象。

簡(jiǎn)單一點(diǎn)的說就是:

編碼:字符(能看懂的)--字節(jié)(看不懂的)

解碼:字節(jié)(看不懂的)-->字符(能看懂的)

代碼解釋則是

  • 字符編碼 Character Encoding: 就是一套自然語言的字符與二進(jìn)制數(shù)之間的對(duì)應(yīng)規(guī)則。而編碼表則是生活中文字和計(jì)算機(jī)中二進(jìn)制的對(duì)應(yīng)規(guī)則

字符集

  • 字符集 Charset:也叫編碼表。是一個(gè)系統(tǒng)支持的所有字符的集合,包括各國家文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等。

計(jì)算機(jī)要準(zhǔn)確的存儲(chǔ)和識(shí)別各種字符集符號(hào),需要進(jìn)行字符編碼,一套字符集必然至少有一套字符編碼。常見字符集有ASCII字符集、GBK字符集、Unicode字符集等。
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

可見,當(dāng)指定了編碼,它所對(duì)應(yīng)的字符集自然就指定了,所以編碼才是我們最終要關(guān)心的。

  • ASCII字符集 :ASCII(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),用于顯示現(xiàn)代英語,主要包括控制字符(回車鍵、退格、換行鍵等)和可顯示字符(英文大小寫字符、阿拉伯?dāng)?shù)字和西文符號(hào))。基本的ASCII字符集,使用7位(bits)表示一個(gè)字符,共128字符。ASCII的擴(kuò)展字符集使用8位(bits)表示一個(gè)字符,共256字符,方便支持歐洲常用字符。
  • ISO-8859-1字符集:拉丁碼表,別名Latin-1,用于顯示歐洲使用的語言,包括荷蘭、丹麥、德語、意大利語、西班牙語等。ISO-8859-1使用單字節(jié)編碼,兼容ASCII編碼。
  • GBxxx字符集:GB就是國標(biāo)的意思,是為了顯示中文而設(shè)計(jì)的一套字符集。GB2312:簡(jiǎn)體中文碼表。一個(gè)小于127的字符的意義與原來相同。但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)漢字,這樣大約可以組合了包含7000多個(gè)簡(jiǎn)體漢字,此外數(shù)學(xué)符號(hào)、羅馬希臘的字母、日文的假名們都編進(jìn)去了,連在ASCII里本來就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長(zhǎng)的編碼,這就是常說的"全角"字符,而原來在127號(hào)以下的那些就叫"半角"字符了。GBK:最常用的中文碼表。是在GB2312標(biāo)準(zhǔn)基礎(chǔ)上的擴(kuò)展規(guī)范,使用了雙字節(jié)編碼方案,共收錄了21003個(gè)漢字,完全兼容GB2312標(biāo)準(zhǔn),同時(shí)支持繁體漢字以及日韓漢字等。GB18030:最新的中文碼表。收錄漢字70244個(gè),采用多字節(jié)編碼,每個(gè)字可以由1個(gè)、2個(gè)或4個(gè)字節(jié)組成。支持中國國內(nèi)少數(shù)民族的文字,同時(shí)支持繁體漢字以及日韓漢字等。
  • Unicode字符集 :Unicode編碼系統(tǒng)為表達(dá)任意語言的任意字符而設(shè)計(jì),是業(yè)界的一種標(biāo)準(zhǔn),也稱為統(tǒng)一碼、標(biāo)準(zhǔn)萬國碼。它最多使用4個(gè)字節(jié)的數(shù)字來表達(dá)每個(gè)字母、符號(hào),或者文字。有三種編碼方案,UTF-8、UTF-16和UTF-32。最為常用的UTF-8編碼。UTF-8編碼,可以用來表示Unicode標(biāo)準(zhǔn)中任何字符,它是電子郵件、網(wǎng)頁及其他存儲(chǔ)或傳送文字的應(yīng)用中,優(yōu)先采用的編碼。互聯(lián)網(wǎng)工程工作小組(IETF)要求所有互聯(lián)網(wǎng)協(xié)議都必須支持UTF-8編碼。所以,我們開發(fā)Web應(yīng)用,也要使用UTF-8編碼。它使用一至四個(gè)字節(jié)為每個(gè)字符編碼,編碼規(guī)則:128個(gè)US-ASCII字符,只需一個(gè)字節(jié)編碼。拉丁文等字符,需要二個(gè)字節(jié)編碼。大部分常用字(含中文),使用三個(gè)字節(jié)編碼。其他極少使用的Unicode輔助字符,使用四字節(jié)編碼。

2.2 編碼問題導(dǎo)致亂碼

在java開發(fā)工具IDEA中,使用FileReader 讀取項(xiàng)目中的文本文件。由于IDEA的設(shè)置,都是默認(rèn)的UTF-8編碼,所以沒有任何問題。但是,當(dāng)讀取Windows系統(tǒng)中創(chuàng)建的文本文件時(shí),由于Windows系統(tǒng)的默認(rèn)是GBK編碼,就會(huì)出現(xiàn)亂碼。

那么如何讀取GBK編碼的文件呢? 這個(gè)時(shí)候就得講講轉(zhuǎn)換流了!

從另一角度來講:字符流=字節(jié)流+編碼表

2.3 InputStreamReader類-----(字節(jié)流到字符流的橋梁)

轉(zhuǎn)換流java.io.InputStreamReader,是Reader的子類,從字面意思可以看出它是從字節(jié)流到字符流的橋梁。它讀取字節(jié),并使用指定的字符集將其解碼為字符。它的字符集可以由名稱指定,也可以接受平臺(tái)的默認(rèn)字符集。

構(gòu)造方法

InputStreamReader(InputStream in): 創(chuàng)建一個(gè)使用默認(rèn)字符集的字符流。
InputStreamReader(InputStream in, String charsetName): 創(chuàng)建一個(gè)指定字符集的字符流。

構(gòu)造代碼如下:

使用轉(zhuǎn)換流解決編碼問題

2.4 OutputStreamWriter類-----(字符流到字節(jié)流的橋梁)

轉(zhuǎn)換流java.io.OutputStreamWriter ,是Writer的子類,字面看容易混淆會(huì)誤以為是轉(zhuǎn)為字符流,其實(shí)不然,OutputStreamWriter為從字符流到字節(jié)流的橋梁。使用指定的字符集將字符編碼為字節(jié)。它的字符集可以由名稱指定,也可以接受平臺(tái)的默認(rèn)字符集。

構(gòu)造方法

OutputStreamWriter(OutputStream in): 創(chuàng)建一個(gè)使用默認(rèn)字符集的字符流。
OutputStreamWriter(OutputStream in, String charsetName): 創(chuàng)建一個(gè)指定字符集的字符流。

構(gòu)造舉例,代碼如下:

指定編碼構(gòu)造代碼

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 


為了達(dá)到最高效率,可以考慮在 BufferedReader 內(nèi)包裝 InputStreamReader

3、序列化流【理解】

(1)可以把對(duì)象寫入文本文件或者在網(wǎng)絡(luò)中傳輸
(2)如何實(shí)現(xiàn)序列化呢?
讓被序列化的對(duì)象所屬類實(shí)現(xiàn)序列化接口。
該接口是一個(gè)標(biāo)記接口。沒有功能需要實(shí)現(xiàn)。
(3)注意問題:
把數(shù)據(jù)寫到文件后,在去修改類會(huì)產(chǎn)生一個(gè)問題。
如何解決該問題呢?
在類文件中,給出一個(gè)固定的序列化id值。
而且,這樣也可以解決黃色警告線問題
(4)面試題:
什么時(shí)候序列化?
如何實(shí)現(xiàn)序列化?
什么是反序列化?

3.1 何謂序列化

Java 提供了一種對(duì)象序列化的機(jī)制。用一個(gè)字節(jié)序列可以表示一個(gè)對(duì)象,該字節(jié)序列包含該對(duì)象的數(shù)據(jù)、對(duì)象的類型和對(duì)象中存儲(chǔ)的屬性等信息。字節(jié)序列寫出到文件之后,相當(dāng)于文件中持久保存了一個(gè)對(duì)象的信息。

反之,該字節(jié)序列還可以從文件中讀取回來,重構(gòu)對(duì)象,對(duì)它進(jìn)行反序列化。對(duì)象的數(shù)據(jù)、對(duì)象的類型和對(duì)象中存儲(chǔ)的數(shù)據(jù)信息,都可以用來在內(nèi)存中創(chuàng)建對(duì)象。看圖理解序列化:
 

史上最騷最全最詳細(xì)的IO流教程,沒有之一

 

3.2 ObjectOutputStream類

java.io.ObjectOutputStream 類,將Java對(duì)象的原始數(shù)據(jù)類型寫出到文件,實(shí)現(xiàn)對(duì)象的持久存儲(chǔ)。

構(gòu)造方法

public ObjectOutputStream(OutputStream out): 創(chuàng)建一個(gè)指定OutputStream的ObjectOutputStream。

構(gòu)造代碼如下:

序列化操作

  1. 一個(gè)對(duì)象要想序列化,必須滿足兩個(gè)條件:

該類必須實(shí)現(xiàn)java.io.Serializable 接口,Serializable 是一個(gè)標(biāo)記接口,不實(shí)現(xiàn)此接口的類將不會(huì)使任何狀態(tài)序列化或反序列化,會(huì)拋出NotSerializableException 。

該類的所有屬性必須是可序列化的。如果有一個(gè)屬性不需要可序列化的,則該屬性必須注明是瞬態(tài)的,使用transient 關(guān)鍵字修飾。

2.寫出對(duì)象方法

public final void writeObject (Object obj) : 將指定的對(duì)象寫出。

3.3 ObjectInputStream類

ObjectInputStream反序列化流,將之前使用ObjectOutputStream序列化的原始數(shù)據(jù)恢復(fù)為對(duì)象。

構(gòu)造方法

public ObjectInputStream(InputStream in): 創(chuàng)建一個(gè)指定InputStream的ObjectInputStream。

反序列化操作1

如果能找到一個(gè)對(duì)象的class文件,我們可以進(jìn)行反序列化操作,調(diào)用ObjectInputStream讀取對(duì)象的方法:

  • public final Object readObject () : 讀取一個(gè)對(duì)象。

對(duì)于JVM可以反序列化對(duì)象,它必須是能夠找到class文件的類。如果找不到該類的class文件,則拋出一個(gè) ClassNotFoundException 異常。

反序列化操作2

另外,當(dāng)JVM反序列化對(duì)象時(shí),能找到class文件,但是class文件在序列化對(duì)象之后發(fā)生了修改,那么反序列化操作也會(huì)失敗,拋出一個(gè)InvalidClassException異常。發(fā)生這個(gè)異常的原因如下:

1、該類的序列版本號(hào)與從流中讀取的類描述符的版本號(hào)不匹配
2、該類包含未知數(shù)據(jù)類型
2、該類沒有可訪問的無參數(shù)構(gòu)造方法

Serializable 接口給需要序列化的類,提供了一個(gè)序列版本號(hào)。serialVersionUID 該版本號(hào)的目的在于驗(yàn)證序列化的對(duì)象和對(duì)應(yīng)類是否版本匹配。

3.4 序列化集合練習(xí)

  1. 將存有多個(gè)自定義對(duì)象的集合序列化操作,保存到list.txt文件中。
  2. 反序列化list.txt ,并遍歷集合,打印對(duì)象信息。

案例分析

  1. 把若干學(xué)生對(duì)象 ,保存到集合中。
  2. 把集合序列化。
  3. 反序列化讀取時(shí),只需要讀取一次,轉(zhuǎn)換為集合類型。
  4. 遍歷集合,可以打印所有的學(xué)生信息

案例代碼實(shí)現(xiàn)

4、打印流【掌握】

4.1 何謂打印流

平時(shí)我們?cè)诳刂婆_(tái)打印輸出,是調(diào)用print方法和println方法完成的,各位用了這么久的輸出語句肯定沒想過這兩個(gè)方法都來自于java.io.PrintStream類吧,哈哈。該類能夠方便地打印各種數(shù)據(jù)類型的值,是一種便捷的輸出方式。

打印流分類

字節(jié)打印流PrintStream,字符打印流PrintWriter

打印流特點(diǎn)

A:只操作目的地,不操作數(shù)據(jù)源
B:可以操作任意類型的數(shù)據(jù)
C:如果啟用了自動(dòng)刷新,在調(diào)用println()方法的時(shí)候,能夠換行并刷新
D:可以直接操作文件

這個(gè)時(shí)候有同學(xué)就要問了,哪些流可以直接操作文件呢?答案很簡(jiǎn)單,如果該流的構(gòu)造方法能夠同時(shí)接收File和String類型的參數(shù),一般都是可以直接操作文件的

PrintStream是OutputStream的子類,PrintWriter是Writer的子類,兩者處于對(duì)等的位置上,所以它們的API是非常相似的。二者區(qū)別無非一個(gè)是字節(jié)打印流,一個(gè)是字符打印流。

4.2 字節(jié)輸出打印流PrintStream復(fù)制文本文件

4.3 字符輸出打印流PrintWriter復(fù)制文本文件

5、Properties屬性類

我想各位對(duì)這個(gè)Properties類多多少少也接觸過了,首先Properties類并不在IO包下,那為啥要和IO流一起講呢?原因很簡(jiǎn)單因?yàn)閜roperties類經(jīng)常和io流的聯(lián)合一起使用。

(1)是一個(gè)集合類,Hashtable的子類
(2)特有功能
A:public Object setProperty(String key,String value)
B:public String getProperty(String key)
C:public Set stringPropertyNames()
(3)和IO流結(jié)合的方法
把鍵值對(duì)形式的文本文件內(nèi)容加載到集合中
public void load(Reader reader)
public void load(InputStream inStream)
把集合中的數(shù)據(jù)存儲(chǔ)到文本文件中
public void store(Writer writer,String comments)
public void store(OutputStream out,String comments)

5.1 Properties概述

java.util.Properties 繼承于Hashtable ,來表示一個(gè)持久的屬性集。它使用鍵值結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串。該類也被許多Java類使用,比如獲取系統(tǒng)屬性時(shí),System.getProperties 方法就是返回一個(gè)Properties對(duì)象。

5.2 Properties類

構(gòu)造方法

public Properties() :創(chuàng)建一個(gè)空的屬性列表。

基本的存儲(chǔ)方法

  • public Object setProperty(String key, String value) : 保存一對(duì)屬性。
  • public String getProperty(String key) :使用此屬性列表中指定的鍵搜索屬性值。
  • public Set<String> stringPropertyNames() :所有鍵的名稱的集合。

與流相關(guān)的方法

public void load(InputStream inStream): 從字節(jié)輸入流中讀取鍵值對(duì)。

參數(shù)中使用了字節(jié)輸入流,通過流對(duì)象,可以關(guān)聯(lián)到某文件上,這樣就能夠加載文本中的數(shù)據(jù)了。現(xiàn)在文本數(shù)據(jù)格式如下:

加載代碼演示:

文本中的數(shù)據(jù),必須是鍵值對(duì)形式,可以使用空格、等號(hào)、冒號(hào)等符號(hào)分隔。

怎么說呢,io流的基礎(chǔ)回顧就先告一段落了,淺嘗輒止。循序漸進(jìn),實(shí)踐中慢慢總結(jié)!更何況我還很low,依舊任重而道遠(yuǎn)。

現(xiàn)在jdk已經(jīng)出到13了,io流也有了許多的變化。有時(shí)間會(huì)從頭整理一下,一定會(huì)有機(jī)會(huì)的!

分享到:
標(biāo)簽:IO
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定