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