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