1、字节流详解
文章目錄
- 一、字節流
- 1、字節輸出流:OutputStream
- 2、字節輸入流:InputStream
- 3、使用字節流復制數據
- 4、字節緩沖流
一、字節流
文件字節流
字節流的兩個抽象父類:字節輸出流:OutputStream和字節輸入流:InputStream
1、字節輸出流:OutputStream
這個抽象類是表示字節輸出流的所有類的超類。 輸出流接收輸出字節并將其發送到某個接收器。- 查看API可以知道,字節流寫數據一共有三種方式:
- public void write(int b) :寫入一個字節
- public void write(byte[] b):寫入一個字節數組
- public void write(byte[] b,int off,int len):寫入一個字節數組的一部分
- close():關閉此文件輸入流,并釋放與流相關的所有系統資源
- 使用字節輸出流寫入數據:使用 OutputStream 它的子類 FileOutputStream
- FileOutputStream 類的構造方法:
- FileOutputStream(File file)
- FileOutputStream(String name)
- FileOutputStream 類的構造方法:
- 字節輸出流寫入數據的操作步驟:
- 第一步:創建字節輸出流對象 ,并指定文件路徑,不指定文件路徑默認在項目路徑。如果該路徑沒有該文件,創建字節輸入流對象會將該文件創建出來
- 第二步:用輸出流對象點 write() 方法,根據傳入的參數確認調用的那個寫入的方法,并將參數內容寫入流對象指定的文件中
- 第三步:關閉流對象
-
Demo代碼示例
public class FileOutputStreamDemo {public static void main(String[] args) throws IOException {// 創建字節輸出流對象(FileOutputStream的這兩種構造方法效果是一樣的用那個都可以)// FileOutputStream(File file)// File file = new File("fos.txt");// FileOutputStream fos = new FileOutputStream(file);//構造方法: FileOutputStream(String name)FileOutputStream fos = new FileOutputStream("fos.txt");try {// 調用write()方法,向fos文件中寫入數據,寫入一個字節fos.write(97); //輸出結果是97 -- 底層二進制數據 -- 通過記事本打開 -- 找97對應的字符值 -- a//換行fos.write("\r\n".getBytes());//public void write(byte[] b):寫一個字節數組byte[] bys={97,98,99,100,101};fos.write(bys);//輸出結果是abcde//換行fos.write("\r\n".getBytes());//public void write(byte[] b,int off,int len):寫一個字節數組的一部分,存儲數據下標范圍fos.write(bys,1,3);//輸出結果是bcd//換行fos.write("\r\n".getBytes());//調用write()方法,向fos文件中寫入數據,寫入一段字符串并轉換成 Byte 數組fos.write("HelloWorld\t".getBytes());fos.write("JAVA\t".getBytes());} catch (IOException e) {e.printStackTrace();} finally {//釋放資源,這一步很重要,如果不關閉流,流對象就會始終存在,占用的內容空間!!!//關閉此文件輸出流并釋放與此流有關的所有系統資源。fos.close();}} }
運行結果:
運行程序,完成之后刷新項目,就可以看到創建的fos.txt的文件,并且里面的內容是寫入數據的內容 :
如果不關閉流,流對象就會始終存在,占用的內容空間!所以使用該方法讓流對象變成垃圾,這樣就可以被垃圾回收器回收了。
??? ???字節輸出流操作步驟:
??? ?????? ???A:創建字節輸出流對象
??? ?????? ???B:寫數據
??? ?????? ???C:釋放資源
??? ???我們在寫代碼時候,一定要先將問題總結出來,不然容易將自己搞得很混亂,代碼質量也不高。所以要一步一步的將功能的整體實現步驟總結出來,這樣會讓你的思路更清晰,代碼寫的更流暢!
2、字節輸入流:InputStream
這個抽象類是表示字節輸入流的所有類的超類。-
使用字節輸入流讀取數據:使用 InputStream的子類FileInputStream
- FileInputStream 類的構造方法
- FileInputStream(File file)
- FileInputStream(String name)
- FileInputStream的成員方法
- public int read():一次讀取一個字節
- public int read(byte[] b):一次讀取一個字節數組
- FileInputStream 類的構造方法
-
字節輸入流讀取數據的操作步驟:
- 第一步:創建字節輸入流對象 ,并指定文件路徑,不指定文件路徑默認在項目路徑。如果該路徑沒有該文件,便會報出找不到文件的錯誤
- 第二步:調用read()方法讀取數據,并把數據顯示在控制臺
- 第三步:關閉流對象
- Demo代碼示例
運行結果:
3、使用字節流復制數據
學習了文件操作類 File 類,以及上面的字節流讀取和寫入數據,接下來學習如何使用 File 類和字節流讀取和寫入數據實現數據的復制功能。
??? ?????? ??? 在實現復制功能時候,需要注意兩點:
??? ?????? ??? 1、數據源:從哪里來
??? ?????? ?????? ?????? ???從 fos.txt 中讀取數據,然后將讀取到的數據存儲到 FileInputStream 對象中。
??? ?????? ??? 2、目的地:到哪里去
??? ?????? ?????? ?????? ???通過 FileOutputStream 對象找到數據封裝地,然后將從數據源讀取出來的數據寫入數據封裝地。
Demo代碼示例:
public class IO_CopyFile {public static void main(String[] args) throws IOException{IO_CopyFile cf = new IO_CopyFile ();cf .copyFile();}//公共變量FileInputStream copy = null;FileOutputStream paste = null;// 文件復制方法public void copyFile() throws IOException{try {//指定封裝數據源,該數據源需要是真實存在的,從該數據源中獲取數據copy = new FileInputStream("fos.txt");//指定封裝目的地,將從數據源獲取到的數據存儲在此文件中paste = new FileOutputStream("copy.txt");//使用這個方法可以將文件復制過去,但是效率會很慢,一個字節一個字節復制/* int by = 0;while ((by = copy.read()) != -1) {paste.write(by);}*///在實際開發中要是寫復制文件的功能的話通常使用下面這個方法,一個復制1024個字節,會大大提升復制的效率// 數組的長度一般是1024或者1024的整數倍byte[] bys = new byte[1024];int len = 0;//copy對象調用read(),將copy對象所指定的文件中的字節數據內容讀取出來,并存儲在len變量中while ((len = copy.read(bys)) != -1) {//paste對象調用write方法,將len變量中的內容寫入paste對象所指定的文件中paste.write(bys, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {// 釋放字節輸出流和輸入流資源copy.close();paste.close();}} }運行結果:
項目路徑下會出現新創建的封裝地文件–copy.txt
并且也成功的將文件內的數據復制到了封裝地文件中。
4、字節緩沖流
在實現字節流復制數據的時候,可以發現字節一個一個讀取和寫入數據的效率要比一次讀取和寫入一個數組的效率要低。這是因為數組有著緩沖區的效果,所以使用數組讀寫數據會有效的提高效率。??? ???java 本身在設計的時候,也考慮到了這樣的設計思想(裝飾設計模式),所以提供了字節緩沖區流。
??? ???這種類被稱為:緩沖區類(高效類),其實和字節輸入流和輸出流的使用方法差不多,就是在原本的基礎上提供了一個緩沖區。有效的提高我們在使用 IO 流時數據的流通效率。
- 緩沖區類(高效類)
-
字節緩沖輸出流
- BufferedOutputStream
- 使用字節緩沖輸入流寫入數據
- Demo代碼示例:public class BufferedOutputStreamDemo {public static void main(String[] args) throws IOException {// BufferedOutputStream(OutputStream out)// 創建字節緩沖輸出流對象,將字節輸出流對象放入緩沖區中BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));// 寫數據bos.write("hello".getBytes());// 釋放資源bos.close();}
}
運行結果:
- Demo代碼示例:public class BufferedOutputStreamDemo {public static void main(String[] args) throws IOException {// BufferedOutputStream(OutputStream out)// 創建字節緩沖輸出流對象,將字節輸出流對象放入緩沖區中BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));// 寫數據bos.write("hello".getBytes());// 釋放資源bos.close();}
}
運行結果:
- 使用字節緩沖輸入流寫入數據
- BufferedOutputStream
-
字節緩沖輸入流
- BufferedInputStream
-
使用字節緩沖輸入流讀取數據
- Demo代碼示例: public class BufferedInputStreamDemo {public static void main(String[] args) throws IOException {// BufferedInputStream(InputStream in)// 創建字節緩沖輸入流對象,將字節輸入流對象放入緩沖區中BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "bos.txt"));// 讀取數據byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {// 將讀取出來的數據打印在控制臺System.out.print(new String(bys, 0, len));}// 釋放資源bis.close();}}
運行結果:
- Demo代碼示例: public class BufferedInputStreamDemo {public static void main(String[] args) throws IOException {// BufferedInputStream(InputStream in)// 創建字節緩沖輸入流對象,將字節輸入流對象放入緩沖區中BufferedInputStream bis = new BufferedInputStream(new FileInputStream( "bos.txt"));// 讀取數據byte[] bys = new byte[1024];int len = 0;while ((len = bis.read(bys)) != -1) {// 將讀取出來的數據打印在控制臺System.out.print(new String(bys, 0, len));}// 釋放資源bis.close();}}
運行結果:
-
- 使用字節緩沖流復制數據
- Demo代碼示例:
運行結果:
總結
- 上一篇: autojspro常用的代码和公共函数搜
- 下一篇: Matlab中的向量和数组(超详细)