標籤:mem long file throws 資源 移位 估計 記憶體 com
位元組流
在I/O類庫中,java.io.InputStream和java.io.OutputStream分別表示位元組輸入資料流和位元組輸出資料流,它們都是抽象類別,不能執行個體化,資料流中的最小單位是位元組,所以叫做位元組流。
一、InputStream中的讀取資料的方法如下:
1 、int read()
功能:讀取一個位元組的資料,並且返回讀到得資料,如果返回-1,則表示讀到輸入資料流的末尾。
2、int read(byte[] b)
功能:從輸入資料流中讀取一定量的位元組,並將其儲存在位元組數組b中,返回實際讀取的位元組數,如果返回-1,則表示讀到輸入資料流的末尾。
3、int read(byte[] b, int off, int len)
功能:將資料讀入一個位元組數組,同時返回讀取的實際位元組數,如果返回-1,則表示讀到輸入資料流的末尾。off指定在數組b中存放資料的起始位移位置,len指定讀取的最大位元組數。
4、available()
功能:返回此輸入資料流下一個方法調用可以不受阻塞地從此輸入資料流讀取或跳過的估計位元組數。
5、close()
功能:關閉輸入資料流,釋放這個流的相關資源。
二、OutputStream中寫入資料的方法如下:
1 、int write(int b)
功能:將b的最低的一個位元組寫入此輸入資料流,其他三個位元組丟棄。
2、int write(byte[] b)
功能:將指定的位元組數組b寫入此輸入資料流。
3、int write(byte[] b, int off, int len)
功能:將指定byte數組中從位移量off開始的len個位元組寫入輸入資料流。
4、flush()
功能:重新整理此輸入資料流並強制寫出所有緩衝的輸出位元組數。
5、close()
功能:關閉輸出資料流,釋放這個流的相關資源。
字元流
是以字元為單位進行IO操作的,一個字元為兩個位元組,最大的兩個父類為Writer和Reader這兩個抽象類別。
當就位元組流與字元流抽象類別中的方法來看其實方法名,傳回值類型等都很相似,只是在傳入參數部分位元組流的write()方法需要傳入的是位元組數組字元流的write()方法需要傳入的是字元數組(String也算字元數組?)
但是我們都知道字元數組和位元組數組是很容易通過getBytes()和new String()來互換的
位元組流和字元流的主要區別是什麼呢?
一.位元組流在操作時不會用到緩衝區(記憶體),是直接對檔案本身進行操作的。而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案。
二.在硬碟上的所有檔案都是以位元組形式存在的(圖片,聲音,視頻),而字元值在記憶體中才會形成。
解析:
針對第一點,
如果一個程式頻繁對一個資源進行IO操作,效率會非常低。此時,通過緩衝區,先把需要操作的資料暫時放入記憶體中,以後直接從記憶體中讀取資料,則可以避免多次的IO操作,提高效率
針對第二點,
真正儲存和傳輸資料時都是以位元組為單位的,字元只是存在與記憶體當中的,所以,位元組流適用範圍更為寬廣
三.注意: 字元流其實是通過轉換流變化為位元組流再進行IO操作
我們知道Reader和Writer都是抽象類別,要進行具體的操作,都需要通過多態,利用具體實現的類中具體實現的方法進行操作
package com.lw.InputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/* 將一張圖片拷貝到另外一個地方。 */public class Demo3 { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub copeImage(); } public static void copeImage() throws IOException{ //一遍讀取一遍寫入。 //無論你是是使用的輸出資料流還是輸入資料流,操作的一定是檔案。 //1.讀取資料 //輸入位元組流 //1.找到需要複製的圖片 File file = new File("D:\\images\\01.jpg"); // NotFoundException FileInputStream inputStream = new FileInputStream(file); File file1 = new File("D:\\01.jpg"); FileOutputStream outputStream = new FileOutputStream(file1); byte[] b = new byte[1024]; //int count = 0; while(inputStream.read(b)!=-1){ //2.寫入資料 //輸出位元組流 outputStream.write(b); } //關閉流 關閉流的原則: 先開後關 後開的先關。 outputStream.close(); inputStream.close(); }}
1 package com.lw.InputStream; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 public class Demo1 { 8 9 /**10 * @param args11 * @throws IOException 12 */13 public static void main(String[] args) throws IOException {14 // TODO Auto-generated method stub15 16 getFile4();17 }18 19 //方式四:通過建立緩衝區和迴圈的方式來讀取20 public static void getFile4() throws IOException{21 //擷取起始時間:22 long startTime = System.currentTimeMillis();23 //1.找目標檔案24 File file = new File("D:\\images\\01.jpg");25 //2.建立通道26 FileInputStream fileInputStream = new FileInputStream(file);27 //3.建立一個緩衝區28 //3k29 byte[] b = new byte[1024]; // 一般寫1024倍數 理論上設定的緩衝區越大 讀取的效率越高30 //4.讀取資料31 int count = 0;32 while((count = fileInputStream.read(b))!=-1){33 34 System.out.println(new String(b,0,count));35 }36 //5.關閉資源37 fileInputStream.close();38 //結束時間39 long endTime = System.currentTimeMillis();40 41 System.out.println("所花時間:"+(endTime - startTime));//399 接近20多倍42 }
java中位元組流與字元流的區別