日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Java】I/O流之字节流

發(fā)布時間:2023/12/29 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java】I/O流之字节流 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是字節(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流之字节流的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。