搜尋
首頁JavaJava基礎java字元流與位元組流的差別是什麼

java字元流與位元組流的差別是什麼

java中字元流與位元組流的區別:(推薦:java影片教學

1、位元組流操作的基本單元為位元組;字元流操作的基本單元為Unicode碼元。

2、位元組流預設不使用緩衝區;字元流使用緩衝區。

3、位元組流通常用於處理二進位數據,實際上它可以處理任意類型的數據,但它不支援直接寫入或讀取Unicode碼元;字元流通常處理文字數據,它支持寫入及讀取Unicode碼元。

位元組流

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  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 <p>從以上的程式碼我們可以看到,實際上read(byte[])方法內部也是透過循環呼叫read()方法來實現「一次」讀入一個位元組數組的,因此本質來說這個方法也未使用記憶體緩衝區。要使用記憶體緩衝區以提高讀取的效率,我們應該使用BufferedInputStream。 </p><p><strong>字元流</strong></p><p>Java中的字元流處理的最基本的單元是Unicode碼元(大小2位元組),它通常用來處理文字資料。所謂Unicode碼元,也就是一個Unicode代碼單元,範圍是0x0000~0xFFFF。在以上範圍內的每個數字都與一個字元相對應,Java中的String類型預設就把字元以Unicode規則編碼而後儲存在記憶體中。 </p><p>然而與儲存在記憶體中不同,儲存在磁碟上的資料通常有著各種各樣的編碼方式。使用不同的編碼方式,相同的字元會有不同的二進位表示。實際上字元流是這樣運作的:</p><p>輸出字元流:把要寫入檔案的字元序列(實際上是Unicode碼元序列)轉為指定編碼方式下的位元組序列,然後再寫入到檔案中;</p><p>輸入字元流:把要讀取的位元組序列按指定編碼方式解碼為對應字元序列(實際上是Unicode碼元序列從)從而可以存在記憶體中。 </p><p>   我們透過一個demo來加深對此過程的理解,範例程式碼如下:</p><pre class="brush:php;toolbar:false">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();
        }
    }
}

更多java知識請關注java基礎教學欄位。

以上是java字元流與位元組流的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境