java IO 字節(jié)流詳解及實(shí)例代碼
java IO 字節(jié)流詳解
1. 如何理解輸入輸出流?
這是我當(dāng)初在學(xué)習(xí)Java IO這一塊很難理解的一塊,輸入輸出流我們可必須以一個(gè)為參照物:我們以?xún)?nèi)存為參照物,凡是寫(xiě)入內(nèi)存的我們叫輸入流,從內(nèi)存中寫(xiě)出的我們叫輸出流。看下面的示例圖

有了這樣的一個(gè)概念對(duì)于我們?cè)賹W(xué)習(xí)Java中的IO流我相信就會(huì)變得特別簡(jiǎn)單了。
2. 再看流的分類(lèi)
流的分類(lèi),Java的流分類(lèi)比較豐富,剛接觸的人看了后會(huì)感覺(jué)很暈。流分類(lèi)的方式很多:
1、按照輸入的方向分,輸入流和輸出流,輸入輸出的參照對(duì)象是Java程序。(InputStream OutPutStream)
2、按照處理數(shù)據(jù)的單位不同分,字節(jié)流和字符流,字節(jié)流讀取的最小單位是一個(gè)字節(jié)(1byte=8bit),而字符流一次可以讀取一個(gè)字符(1char = 2byte = 16bit)。(InputStream Reader)
3、按照功能的不同分,分節(jié)點(diǎn)流和處理流,節(jié)點(diǎn)流是直接從一個(gè)源讀寫(xiě)數(shù)據(jù)的流(這個(gè)流沒(méi)有經(jīng)過(guò)包裝和修飾),處理流是在對(duì)節(jié)點(diǎn)流封裝的基礎(chǔ)上的 一種流,F(xiàn)ileInputStream是一個(gè)接點(diǎn)流,可以直接從文件讀取數(shù)據(jù),但是BufferedInputStream可以包裝 FileInputStream,使得其有緩沖功能。(FileInputStream BufferedInputStream)
其實(shí)除了以上三種分類(lèi)外,還有一些常常聽(tīng)到的一些分類(lèi)比如:對(duì)象流、緩沖流、壓縮流、文件流等等。其實(shí)都是節(jié)點(diǎn)流和處理流的子分類(lèi)。當(dāng)然你也可以創(chuàng)建新的流類(lèi)型,只要你需要。
3. 字節(jié)流:
字節(jié)流主要操作byte類(lèi)型數(shù)據(jù),以byte數(shù)組為準(zhǔn),主要操作類(lèi)有InputStream(字節(jié)輸入流)、OutputSteam(字節(jié)輸出流)由于IputStream和OutputStream都是抽象類(lèi),所要要用這兩個(gè)類(lèi)的話,則首先要通過(guò)子類(lèi)實(shí)例化對(duì)象。下面就是這兩個(gè)類(lèi)的一些子類(lèi)結(jié)構(gòu)圖

1) 字節(jié)輸出流:OutputStream
OutputStream是一個(gè)抽象類(lèi),要想使用它,必須通過(guò)子類(lèi)來(lái)實(shí)例化它。
OutputStream類(lèi)的常用方法
|
方法名稱(chēng) |
描述 |
|
public void close() throws IOException |
關(guān)閉輸出流 |
|
public void flush() throws IOException |
刷新緩沖區(qū) |
|
public void write(byte[] b) throws IOException |
將一個(gè)byte數(shù)組寫(xiě)入數(shù)據(jù)流 |
|
public void write(byte[] b,int off,int len) throws IOException |
將一個(gè)指定范圍的byte數(shù)組寫(xiě)入數(shù)據(jù)流 |
|
public abstract void write(int b) throws IOException |
將一個(gè)字節(jié)數(shù)據(jù)寫(xiě)入數(shù)據(jù)流 |
實(shí)例1:Helloworld從HelloWorld開(kāi)始
功能:(向一個(gè)名為”hello.txt”的文本文件中寫(xiě)一個(gè)“HelloWorld”)
public static void main(String[] args) throws Exception {
// 創(chuàng)建一個(gè)以當(dāng)前工程目錄下的名為“helloworld.txt”的文本文件
File file = new File("hellowolrd.txt");
OutputStream outputStream = null;
// 通過(guò)FileOutPutStream的子類(lèi)實(shí)例化OutputStream對(duì)象
outputStream = new FileOutputStream(file);
// 聲明一個(gè)字符串
String str = "hello,world";
// 將字符串轉(zhuǎn)換成字節(jié)數(shù)組
byte[] b = str.getBytes();
// 寫(xiě)入數(shù)據(jù)
outputStream.write(b);
// 關(guān)閉輸出流
outputStream.close();
outputStream.flush();
}
我們可以看到當(dāng)前工程目錄下已經(jīng)有一個(gè)helloworld.txt且里面已經(jīng)有數(shù)據(jù),如果我們把str的值改變的話,文本文件里的數(shù)據(jù)也會(huì)改變,所以我們想是不是可以不刪除原來(lái)的數(shù)據(jù),在追尾上追加上。
我們只要在構(gòu)造FileOutputStream對(duì)象的時(shí)候選擇另一種構(gòu)造方法就可以了
FileOutputStream(File file,boolean append)
第二個(gè)參數(shù)就是是否采用追加的方式寫(xiě)入到文本文件中
把上面的代碼修改下就可以了
outputStream = new FileOutputStream(file,true);
再?gòu)睦?我們理解我們對(duì)輸入輸出流的理解,在這個(gè)例子里,我們聲明的字符串肯定是在內(nèi)存中的,現(xiàn)在我們要從內(nèi)存中把數(shù)據(jù)寫(xiě)到文本中,所以我們用到輸出流。這也正符合了我對(duì)輸入輸出流的理解,當(dāng)然大家肯定還有其他的理解方式。
2) 字節(jié)輸入流:InputStream
InputStream類(lèi)的常用方法
|
方法名稱(chēng) |
描述 |
|
public void avaliable() throws IOException |
可以取得輸入文件的大小 |
|
public void close() throws IOException |
關(guān)閉輸入流 |
|
public abstract int read() throws IOException |
讀取內(nèi)容,以數(shù)字的方式讀取 |
|
public int read (byte b) throws IOException |
將內(nèi)容讀到byte數(shù)組,同時(shí)返回讀入的個(gè)數(shù) |
與OutputStream類(lèi)一樣,InputStream本身也是一個(gè)抽象類(lèi),要想使用它,也必須依靠其子類(lèi)。
實(shí)例2:還是HelloWorld
在上一個(gè)例子的基礎(chǔ)上我們從文本中讀取數(shù)據(jù)并且把它顯示在控制臺(tái)上
public static void main(String[] args) throws Exception {
// 創(chuàng)建一個(gè)以當(dāng)前工程目錄下的名為“helloworld.txt”的文本文件
// 這個(gè)文件在上一個(gè)例子里已經(jīng)創(chuàng)建,并且里面已有數(shù)據(jù)
File file = new File("hellowolrd.txt");
// 聲明InputStream對(duì)象
InputStream inputStream = null;
// 通過(guò)FileInputStream子類(lèi)實(shí)例化InputStream對(duì)象
inputStream = new FileInputStream(file);
// 聲明一個(gè)字節(jié)數(shù)組用以接收讀入的數(shù)據(jù)
byte[] b = new byte[1024];
// 開(kāi)始讀入數(shù)據(jù),將數(shù)據(jù)內(nèi)容讀到此數(shù)組中
inputStream.read(b);
// 關(guān)閉輸入流
inputStream.close();
// 在控制臺(tái)打印
System.out.println(new String(b));
}
如果以這種方式打印,我們可以看到雖然控制臺(tái)里是打印出了文本文件中的內(nèi)容,但是后面跟了很多空格,這是我們不需要的,對(duì)于這種情況我們有兩種解決方式
方式一:聲明字節(jié)數(shù)組的時(shí)候指定字節(jié)數(shù)組的長(zhǎng)度為文本內(nèi)容的長(zhǎng)度
byte[] b=new byte[(int)file.length()];
方式二:在將字節(jié)數(shù)組轉(zhuǎn)換成字符串的調(diào)用String(byte b,int off,int len)這個(gè)構(gòu)造函數(shù)
System.out.println(new String(b,0,(int)file.length()));
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java中的ProcessBuilder類(lèi)詳細(xì)解析
這篇文章主要介紹了Java中的ProcessBuilder類(lèi)詳細(xì)解析,ProcessBuilder類(lèi)是J2SE 1.5在java.lang中新添加的一個(gè)新類(lèi),此類(lèi)用于創(chuàng)建操作系統(tǒng)進(jìn)程,它提供一種啟動(dòng)和管理進(jìn)程的方法,需要的朋友可以參考下2024-01-01
通過(guò)實(shí)例了解Java 8創(chuàng)建Stream流的5種方法
這篇文章主要介紹了通過(guò)實(shí)例了解Java 8創(chuàng)建Stream流的5種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Java后臺(tái)開(kāi)發(fā)之表單提交之前驗(yàn)證
這篇文章主要介紹了Java后臺(tái)開(kāi)發(fā)之表單提交之前驗(yàn)證的實(shí)現(xiàn)代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友參考下吧2017-02-02
解決SpringBoot2.1.0+RocketMQ版本沖突問(wèn)題
這篇文章主要介紹了解決SpringBoot2.1.0+RocketMQ版本沖突問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
java集合_淺談Iterable和Iterator的區(qū)別
下面小編就為大家?guī)?lái)一篇java集合_淺談Iterable和Iterator的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
SpringBoot攔截器如何獲取http請(qǐng)求參數(shù)
這篇文章主要給大家介紹了SpringBoot攔截器如何獲取http請(qǐng)求參數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

