字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
字節(jié)流
- 抽象類InputStream和OutputStream是字節(jié)流的頂級父類
- 所有的字節(jié)輸入流都繼承自InputStream,所有的輸出流都繼承子OutputStream
InputStream的常用方法:
int read() int read(byte b[]) int read(byte b[], int off, int len) void close()OutputStream的常用方法:
void write(int b) void write(byte b[]) void write(byte b[], int off, int len) void flush() void close()注意:InputStream和OutputStream是抽象類,不能被實例化
InputStream和OutputStream提供不同的子類,這些子類的體系結(jié)構(gòu)圖如下:
字節(jié)流讀寫文件
概述:
在操作文件時,最常見的就是從一個文件中讀取數(shù)據(jù)并將數(shù)據(jù)寫入到另一個文件,這一過程就是文件的讀寫,針對文件的讀寫操作,JDK專門提供兩個類,分別是FileInputStream和FileOutputStream
FileInputStream是InputStream的子類,操作文件的字節(jié)輸入流,專門用于讀取文件中的數(shù)據(jù)
創(chuàng)建一個text.txt文件,在文件中輸入"hello"并保存,然后創(chuàng)建一個讀取文件的類,代碼如下:
package com.Put;import java.io.FileInputStream;public class IO {public static void main(String[] args) throws Exception{//創(chuàng)建一個文件字節(jié)輸入流來讀取文件FileInputStream in = new FileInputStream("text.txt");//定義一個int類型的變量int b = 0;//通過循環(huán)來讀取文件,當(dāng)返回值為-1結(jié)束循環(huán)while ((b=in.read())!=-1){System.out.print(b+" ");// System.out.print((char) b+" "); //h e l l o }//關(guān)閉流in.close();}//運行結(jié)果:104 101 108 108 111 }簡述:
在"text.txt"文件中,字符’h’ ‘e’ ‘l’ ‘l’ 'o’各占一個字節(jié),因此最終結(jié)果顯示的是文件"text.txt"中的5個字節(jié)所對應(yīng)的ASCLL碼值
需要注意的是必須保證文件在相應(yīng)的目錄下存在并且是可讀,否則或拋出java.io.FileNotFoundException異常,即文件找不到異常
FileOutputStream是OutputStream的子類,操作文件的字節(jié)輸出流,用于把數(shù)據(jù)寫入文件
FileOutputStream寫入數(shù)據(jù)時,自動創(chuàng)建了文件out.txt,并自定義的字符串寫入到目標文件中,代碼如下:
package com.Put;import java.io.FileOutputStream;public class IO {public static void main(String[] args) throws Exception{//創(chuàng)建文件輸出流,并指定文件名稱FileOutputStream out = new FileOutputStream("out.txt");//定義一個字符串String str = "hello";//將字符串轉(zhuǎn)換為字節(jié)數(shù)組進行寫入操作out.write(str.getBytes());//關(guān)閉流out.close();} }此外,如果通過FileOutputStream向一個已經(jīng)存在的文件寫入數(shù)據(jù),那么該文件的數(shù)據(jù)首先會被清空,再寫入新的數(shù)據(jù);如果希望再已存在的文件內(nèi)容后追加新內(nèi)容,則可以使用FileOutStream的構(gòu)造函數(shù)FileOutputStream(String fileName,boolean append)來創(chuàng)建文件輸出流對象,并把append參數(shù)的值設(shè)置為true,代碼如下:
package com.Put;import java.io.FileOutputStream;public class IO {public static void main(String[] args) throws Exception{//創(chuàng)建文件輸出流,并指定文件名稱FileOutputStream out = new FileOutputStream("out.txt",true);//定義一個字符串String str = "world";//將字符串轉(zhuǎn)換為字節(jié)數(shù)組進行寫入操作out.write(str.getBytes());//關(guān)閉流out.close();} }注意:如果append參數(shù)為false,存在的數(shù)據(jù)依然會被清空
文件的拷貝
- 文件的拷貝需要通過輸入流來讀取源文件的數(shù)據(jù),并通過輸出流將數(shù)據(jù)寫入新的文件(I/O流成對出現(xiàn),即輸入輸出流一起使用)
簡述:
拷貝過程通過while循環(huán)將字節(jié)逐個進行拷貝,每循環(huán)一次,通過FileInputStream的read()方法讀取一個字節(jié),并通過FileOutputStream的write()方法將該字節(jié)寫入指定文件,循環(huán)往復(fù),直到讀取的長度len為-1,表示讀取到文件的末尾,結(jié)束循環(huán)。文件我使用的是絕對路徑(相對絕對都可)。
效果展示:
程序結(jié)束耗費地時間:
字節(jié)流的緩沖區(qū)
通過流的方法拷貝文件時,為了提高傳輸效率,自定義一個數(shù)組作為緩沖區(qū),可以一次性讀取多個字節(jié)的數(shù)據(jù),將數(shù)據(jù)保存在字節(jié)數(shù)組中,然后將字節(jié)數(shù)組的數(shù)據(jù)一次性寫入到新文件中,代碼如下:
package com.Put;import java.io.FileInputStream; import java.io.FileOutputStream;public class IO {public static void main(String[] args) throws Exception{//創(chuàng)建文件輸入流對象讀取指定目錄下的文件FileInputStream in = new FileInputStream("E:\\Idea\\JavaSE\\重新學(xué)習(xí)\\resource\\985.png");//創(chuàng)建文件輸出流對象將讀取到的文件內(nèi)容寫到指定目錄的文件下FileOutputStream out = new FileOutputStream("E:\\Idea\\JavaSE\\重新學(xué)習(xí)\\target\\211.png");//定義一個int類型的變量int len = 0;//定義一個長度為1024的字節(jié)數(shù)組byte[] buff = new byte[1024]; //!!!!!!!!!!!!!!!!//獲取拷貝文件前的系統(tǒng)時間long beginTime = System.currentTimeMillis();//循環(huán)將讀取到的文件字節(jié)信息寫入到新文件 while ((len=in.read(buff))!=-1){ //!!!!!!!!!!!!!!!!!!out.write(buff,0,len);}//獲取拷貝后之后的系統(tǒng)時間long endTime = System.currentTimeMillis();//輸出拷貝花費時間System.out.println((endTime-beginTime)+"毫秒");in.close();out.close();} }簡述:在拷貝過程中,使用while循環(huán)語句逐漸實現(xiàn)字節(jié)文件的拷貝,每循環(huán)一次,就從文件讀取若干字節(jié)填充到數(shù)組,并通過變量len記住讀入數(shù)組的字節(jié)數(shù),然后從數(shù)組的第一個字節(jié)開始,將len個字節(jié)寫入到新文件。直到len的值為-1,說明已經(jīng)讀到了文件的末尾,循環(huán)結(jié)束,整個拷貝過程就結(jié)束了,最終程序會將整個文件拷貝到目標文件。
運行時間:
字節(jié)緩沖流
- 兩個帶緩沖的字節(jié)流,分別是BufferedInputStream和BufferedOutputStream,他們的構(gòu)造方法中分別接收InputStream和OutputStream類型的參數(shù)作為對象,在讀取時提供緩沖區(qū)功能。
應(yīng)用程序、緩沖流和底層字節(jié)流的關(guān)系,如圖:
從圖可以看出,應(yīng)用程序時通過緩沖流來完成數(shù)據(jù)讀寫的,而緩沖流又是通過底層字節(jié)流與設(shè)備進行關(guān)聯(lián)的。
BufferedInputStream和BufferedOutputStream這兩個緩沖流的用法如下:
package com.Put;import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream;public class IO {public static void main(String[] args) throws Exception{//創(chuàng)建輸入輸出流字節(jié)緩沖流對象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\Idea\\JavaSE\\重新學(xué)習(xí)\\resource\\985.png"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\Idea\\JavaSE\\重新學(xué)習(xí)\\target\\211.png"));//定義一個int類型的變量int len = 0;//獲取拷貝文件前的系統(tǒng)時間long beginTime = System.currentTimeMillis();//通過循環(huán)讀取輸入字節(jié)緩沖流中的數(shù)據(jù),并通過輸出字節(jié)緩沖流寫入到新文件while ((bis.read())!=-1) {bos.write(len);}//獲取拷貝后之后的系統(tǒng)時間long endTime = System.currentTimeMillis();//輸出拷貝花費時間System.out.println((endTime-beginTime)+"毫秒");//關(guān)閉流bis.close();bos.close();} }運行結(jié)果圖:
簡述:
創(chuàng)建了BufferedInputStream和BufferedOutputStream這兩個緩沖流對象,這兩個流內(nèi)部都定義了一個大小為8192的字節(jié)數(shù)組,當(dāng)定義read()和write()方法讀取數(shù)據(jù)時,首先將讀寫的數(shù)據(jù)存入到定義的好的字節(jié)數(shù)組,然后將字節(jié)數(shù)組一次性讀寫到文件中。這種方式與字節(jié)流的緩沖區(qū)相似,都對數(shù)據(jù)進行了緩沖,提高數(shù)據(jù)讀取的效率。
總結(jié)
以上是生活随笔為你收集整理的字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: otrs软件_Otrs用手册.doc
- 下一篇: TCAM.TwinCAD.v3.2.00