java IO的位元組流和字元流及其區別

來源:互聯網
上載者:User

標籤:std   字元   統一   system   write   讀取字串   amr   中國   print   

1. 位元組流和字元流的概念
    1.1 位元組流繼承於InputStream    OutputStream,
    1.2 字元流繼承於InputStreamReader    OutputStreamWriter。
在java.io包中還有許多其他的流,主要是為了提高效能和使用方便。

2. 位元組流與字元流的區別
    2.1 要把一片位元據資料逐一輸出到某個裝置中,或者從某個裝置中逐一讀取一片位元據,不管輸入輸出裝置是什麼,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類別為OutputStream和InputStream,不同的實作類別就代表不同的輸入和輸出裝置,它們都是針對位元組進行操作的。
    
    2.2 在應用中,經常要完全是字元的一段文本輸出去或讀進來,用位元組流可以嗎?電腦中的一切最終都是二進位的位元組形式存在。對於“中國”這些字元,首先要得到其對應的位元組,然後將位元組寫入到輸出資料流。讀取時,首先讀到的是位元組,可是我們要把它顯示為字元,我們需要將位元組轉換成字元。由於這樣的需求很廣泛,人家專門提供了字元流的封裝類。

    2.3 底層裝置永遠只接受位元組資料,有時候要寫字串到底層裝置,需要將字串轉成位元組再進行寫入。字元流是位元組流的封裝,字元流則是直接接受字串,它內部將串轉成位元組,再寫入底層裝置,這為我們向IO設別寫入或讀取字串提供了一點點方便。

    字元向位元組轉換時,要注意編碼的問題,因為字串轉成位元組數組,
    其實是轉成該字元的某種編碼的位元組形式,讀取也是反之的道理。

位元組流與字元流關係的案例:
package com.kobicc.cec.testDemo2;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class IOTest2 {
    public static void main(String[] args) throws Exception {
        String str = "中國人";

        // 方式一【使用位元組流輸入,位元組流輸出。使用了位元組緩衝區】
        FileOutputStream fos = new FileOutputStream("D:\\1.txt");
        fos.write(str.getBytes("UTF-8"));
        fos.close();

        FileInputStream fr = new FileInputStream("D:\\1.txt");
        byte[] buf = new byte[1024];
        int len;
        String myStr = "";
        while ((len = fr.read(buf)) != -1) {
            myStr += new String(buf, 0, len, "UTF-8");
        }
        //String myStr = new String(buf, 0, len, "UTF-8"); //方式二
        System.out.println(myStr);

        // 方式二【使用字元流輸入,字元流輸出。使用了字元緩衝區】
        FileWriter fw = new FileWriter("D:\\2.txt");
        fw.write(str);
        fw.close();

        FileReader fr2 = new FileReader("D:\\2.txt");
        char[] buf2 = new char[1024];
        int len2 = fr2.read(buf2);
        String myStr2 = new String(buf2, 0, len2);
        System.out.println(myStr2);

        // 方式三【使用字元流輸入,字元流輸出,沒有使用緩衝區,直接讀行】
        PrintWriter pw = new PrintWriter("D:\\3.txt", "utf-8");
        pw.write(str);
        pw.close();

        BufferedReader br = new BufferedReader(new InputStreamReader(
                new FileInputStream("D:\\3.txt"), "utf-8"));
        String myStr3 = br.readLine();
        br.close();
        System.out.println(myStr3);
    }
}

java IO的位元組流和字元流及其區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.