詳解Java中字符流與字撙節的差別。本站提示廣大學習愛好者:(詳解Java中字符流與字撙節的差別)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中字符流與字撙節的差別正文
本文為年夜家剖析了Java中字符流與字撙節的差別,供年夜家參考,詳細內容以下
1. 甚麼是流
Java中的流是對字節序列的籠統,我們可以想象有一個水管,只不外如今活動在水管中的不再是水,而是字節序列。和水流一樣,Java中的流也具有一個“活動的偏向”,平日可以從中讀入一個字節序列的對象被稱為輸出流;可以或許向其寫入一個字節序列的對象被稱為輸入流。
2. 字撙節
Java中的字撙節處置的最根本單元為單個字節,它平日用來處置二進制數據。Java中最根本的兩個字撙節類是InputStream和OutputStream,它們分離代表了組根本的輸出字撙節和輸入字撙節。InputStream類與OutputStream類均為籠統類,我們在現實應用中平日應用Java類庫中供給的它們的一系列子類。上面我們以InputStream類為例,來引見下Java中的字撙節。
InputStream類中界說了一個根本的用於從字撙節中讀取字節的辦法read,這個辦法的界說以下:
public abstract int read() throws IOException;
這是一個籠統辦法,也就是說任何派生自InputStream的輸出字撙節類都須要完成這一辦法,這一辦法的功效是從字撙節中讀取一個字節,若到了末尾則前往-1,不然前往讀入的字節。關於這個辦法我們須要留意的是,它會一向壅塞曉得前往一個讀取到的字節或是-1。別的,字撙節在默許情形下是不支撐緩存的,這意味著每挪用一次read辦法都邑要求操作體系來讀取一個字節,這常常會隨同著一次磁盤IO,是以效力會比擬低。有的小同伴能夠以為InputStream類中read的以字節數組為參數的重載辦法,可以或許一次讀入多個字節而不消頻仍的停止磁盤IO。那末畢竟是否是如許呢?我們來看一下這個辦法的源碼:
public int read(byte b[]) throws IOException { return read(b, 0, b.length); }
它挪用了另外一個版本的read重載辦法,那我們就接著往下追:
public int read(byte b[], int off, int len) throws IOException { if (b == null) { throw new NullPointerException(); } else if (off < 0 || len < 0 || len > b.length - off) { throw new IndexOutOfBoundsException(); } else if (len == 0) { return 0; } int c = read(); if (c == -1) { return -1; } b[off] = (byte)c; int i = 1; try { for (; i < len ; i++) { c = read(); if (c == -1) { break; } b[off + i] = (byte)c; } } catch (IOException ee) { } return i; }
從以上的代碼我們可以看到,現實上read(byte[])辦法外部也是經由過程輪回挪用read()辦法來完成“一次”讀入一個字節數組的,是以實質來講這個辦法也未應用內存緩沖區。要應用內存緩沖區以進步讀取的效力,我們應當應用BufferedInputStream。
3. 字符流
Java中的字符流處置的最根本的單位是Unicode碼元(年夜小2字節),它平日用來處置文本數據。所謂Unicode碼元,也就是一個Unicode代碼單位,規模是0x0000~0xFFFF。在以上規模內的每一個數字都與一個字符絕對應,Java中的String類型默許就把字符以Unicode規矩編碼爾後存儲在內存中。但是與存儲在內存中分歧,存儲在磁盤上的數據平日有著各類各樣的編碼方法。應用分歧的編碼方法,雷同的字符會有分歧的二進制表現。現實上字符流是如許任務的:
輸入字符流:把要寫入文件的字符序列(現實上是Unicode碼元序列)轉為指定編碼方法下的字節序列,然後再寫入到文件中;
輸出字符流:把要讀取的字節序列按指定編碼方法解碼為響應字符序列(現實上是Unicode碼元序列從)從而可以存在內存中。
我們經由過程一個demo來加深對這一進程的懂得,示例代碼以下:
import java.io.FileWriter; import java.io.IOException; public class FileWriterDemo { public static void main(String[] args) { FileWriter fileWriter = null; try { try { fileWriter = new FileWriter("demo.txt"); fileWriter.write("demo"); } finally { fileWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } }
以上代碼中,我們應用FileWriter向demo.txt中寫入了“demo”這四個字符,我們用十六進制編纂器WinHex檢查下demo.txt的內容:
從上圖可以看出,我們寫入的“demo”被編碼為了“64 65 6D 6F”,然則我們並沒有在下面的代碼中顯式指定編碼方法,現實上,在我們沒有指准時應用的是操作體系的默許字符編碼方法來對我們要寫入的字符停止編碼。
因為字符流在輸入前現實上是要完成Unicode碼元序列到響應編碼方法的字節序列的轉換,所以它會應用內存緩沖區來寄存轉換後獲得的字節序列,期待都轉換終了再一同寫入磁盤文件中。
4. 字符流與字撙節的差別
經由以上的描寫,我們可以曉得字撙節與字符流之間重要的差別表現在以下幾個方面:
字撙節操作的根本單位為字節;字符流操作的根本單位為Unicode碼元。
字撙節默許不應用緩沖區;字符流應用緩沖區。
字撙節平日用於處置二進制數據,現實上它可以處置隨意率性類型的數據,但它不支撐直接寫入或讀取Unicode碼元;字符流暢常處置文本數據,它支撐寫入及讀取Unicode碼元。
以上是我對Java中字符流與字撙節的一些熟悉,若有論述不清楚或是禁絕確的處所願望年夜家可以斧正,感謝年夜家。