【Java】I/O流之字节流
一、什么是字節(jié)流
二、字節(jié)輸出流
1. 創(chuàng)建一個字節(jié)輸出流對象
2. 寫入數(shù)據(jù)
3. 換行
4. 追加寫入
三、字節(jié)輸入流
1. 創(chuàng)建一個字節(jié)輸入流對象
2. 讀取數(shù)據(jù)
四、利用字節(jié)輸入輸出流復制一個文件
五、以字節(jié)數(shù)組形式讀取
一、什么是字節(jié)流
電腦中存儲的文件都是以二進制以字節(jié)為單位的形式保存,在傳輸時也是按字節(jié)傳輸。所以說,字節(jié)流可以讀取以及傳輸任意格式的文件數(shù)據(jù)。
注意:在創(chuàng)建字節(jié)流時,每創(chuàng)建一個字節(jié)流對象都要在最后關閉流。如果操作比較頻繁并且不對流進行關閉,很容易就出現(xiàn)輸入輸出流超越JVM的邊界,所以有時候就可能無法回收資源。而且不關閉流時,如果在操作系統(tǒng)里對這個文件進行刪除等操作時就會報錯,顯示該文件正在被某個進程占用。
流關閉原則:先開后關,后開先關。
二、字節(jié)輸出流
目的:向文件中寫入數(shù)據(jù)
1. 創(chuàng)建一個字節(jié)輸出流對象
FileOutputStream fw = new FileOutputStream("text.txt");2. 寫入數(shù)據(jù)
字節(jié)流寫入數(shù)據(jù)時操縱的是ASCII碼,即代碼層面寫的數(shù)據(jù)為所要寫入字符的ASCII碼,例如寫入字符A時就要write(65).
(1)以單個字節(jié)形式寫入
fw.write(65);//數(shù)字代表的ASCII碼,寫入的是ASCII碼對應的字符 fw.write(66); fw.write(67); fw.write(68); fw.write(69);(2)以字節(jié)數(shù)組形式寫入
byte[] by = {97,98,99,100,101}; fw.write(by);如果覺得ASCII碼記不住可以利用getBytes()方法,將字符內容自動轉換為ASCII碼
byte[] bys = "12345678".getBytes();//直接將字符轉換為字體默認的編碼格式 fw.write(bys);(3)寫入字節(jié)數(shù)組中指定范圍的內容
byte[] by = {97,98,99,100,101}; fw.write(by, 1, 3);//寫入字節(jié)數(shù)組中指定范圍的內容??
3. 換行
????????我們上面的方法在寫入數(shù)據(jù)時都是一行一行的寫滿才會換下一行,那么當我們需要主動換行時該怎么辦呢?接下來就讓我們一起看看。
? ? ? ? 現(xiàn)在我們已經知道字節(jié)流寫入字符時都是按其ASCII碼寫入,那么相應的,換行符‘\n’也有對應的ASCII碼,所以我們只要在寫入時傳入換行符的ASCII碼就能實現(xiàn)換行操作。?
fw.write("12345\n6789".getBytes());在這里要注意一點,不用的設備系統(tǒng)得換行符標識不同
windows:\r或\n ? ?Linux:\n ? ?Mac:\r
4. 追加寫入
????????以上的寫入方法都是在文件中從頭寫入,會覆蓋原有的文件內容,那么如果我們只想在原有內容后追加內容怎么辦呢?
? ? ? ? 這是就要回到我們創(chuàng)建輸出流對象的時候了,系統(tǒng)默認的創(chuàng)建是不追加,直接從頭開始寫數(shù)據(jù),我們只需要在創(chuàng)建對象時加入?yún)?shù)true,就可以實現(xiàn)追加寫入了。
FileOutputStream fw1 = new FileOutputStream("text.txt",true); fw1.write("\nHolle World".getBytes()); fw1.close();三、字節(jié)輸入流
1. 創(chuàng)建一個字節(jié)輸入流對象
FileInputStream fr = new FileInputStream("text.txt");2. 讀取數(shù)據(jù)
原數(shù)據(jù)內容為“ABC”
System.out.println(fr.read());通過輸出可以看到讀取的為對應的ASCII,那么怎么讓其輸出字符呢?我們可以利用char強制轉換。
int b =fr.read(); System.out.println((char)b+":"+b);//輸出字符及對應的ASCII碼,一次只能讀一個字符現(xiàn)在已經能夠讀取并且輸出字符了,可還有一個問題,write方法一次只能讀取一個字符,要怎么才能一次讀取全部字符呢?我們可以利用循環(huán)來反復多次讀取,但是讀取停止的條件又是什么呢?讓我們多讀取幾個字符看看。?
int b =fr.read(); System.out.println((char)b+":"+b);//輸出字符及對應的ASCII碼,一次只能讀一個字符//多讀取幾次數(shù)據(jù),發(fā)現(xiàn)數(shù)據(jù)讀完時返回結果為-1 b =fr.read(); System.out.println((char)b+":"+b); b =fr.read(); System.out.println((char)b+":"+b); b =fr.read(); System.out.println((char)b+":"+b);通過輸出結果可以看到當所有內容都被讀取完時返回的ASCII碼為-1?,這樣我們就有了循環(huán)停止的條件,即read返回的值為-1時就停止循環(huán)。
int by; while((by = fr.read()) != -1) {System.out.print((char)by); }四、利用字節(jié)輸入輸出流復制一個文件
要求:將一個文件中的內容復制到另一個文件
思路:每讀一次數(shù)據(jù)就寫一次,然后再讀下一次,直到讀完
代碼:
FileInputStream fr = new FileInputStream("text.txt"); FileOutputStream fr1 = new FileOutputStream("text1.txt");int by; while((by = fr.read()) != -1) {System.out.print((char)by);fr1.write(by); } fr1.close(); fr.close();控制臺輸出:
?原文件與復制文件:
五、以字節(jié)數(shù)組形式讀取
????????上面我們讀取內容時都是以單個字符的形式讀取,即對于每個字符都要開關一次讀操作,除此之外還可以以字符數(shù)組的形式讀取,即對于一定數(shù)量的字符進行一次讀取操作。就好比有一隊人要通一扇門,一般的讀取就是每個人通過時都要開一次門再關上,而以數(shù)組形式讀取就是每開一次門后通過一定數(shù)量的人之后再關門等待下一波人通過。這樣可以大大的減少讀寫的速度。
下面我們做了一次實驗,利用兩種不同的讀取方法對一個220M大小的文件讀取,比較其花費的時間。
以字節(jié)數(shù)組形式讀取:?
?以單個字節(jié)形式讀取:
?通過上面的實驗我們可以看到,以字節(jié)數(shù)組形式讀取文件花費的時間為514ms,大約為0.5秒,而以單個字節(jié)形式讀取文件花費的時間為530332ms,大約為8.84分鐘,后者花費時間為前者的1000多倍,可見差距之大。
總結
以上是生活随笔為你收集整理的【Java】I/O流之字节流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦幻西游手游转区没服务器显示不出来,梦幻
- 下一篇: Java工程师岗位职责有哪些 职业发展前