首頁 > 軟體

Java轉換流(InputStreamReader/OutputStreamWriter)的使用

2023-01-28 18:03:04

概述

轉換流是位元組流到字元流的橋樑,在轉換的過程中,可以指定編碼。轉換流也是一種處理流,它提供了位元組流和字元流之間的轉換。

轉換流的兩個類

  • InputStreamReader
  • OutputStreamWriter

為什麼會有轉換流?

眾所周知,計算機中儲存的資料都是二進位制的數位,我們在電腦螢幕上看到的文字資訊是將二進位制轉換之後顯示的,兩者之間存在編碼與解碼的過程,其互相轉換必須遵循某種規則,即編碼和解碼都遵循同一種規則才能將文字資訊正常顯示,如果編碼跟解碼使用了不同的規則,就會出現亂碼的情況。

在預設情況下,是按照UTF-8編碼格式進行操作的

當我們將程式碼中的檔案編碼格式切換成其他編碼格式,再次執行的時候就會出現亂碼

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class CodeQuestion {
    public static void main(String[] args) {
        //讀取E槽下a.txt檔案
        String filePath = "E:\a.txt";
        BufferedReader bufferedReader = null;

        try {
            bufferedReader = new BufferedReader(new FileReader(filePath));
            String file = bufferedReader.readLine();
            System.out.println(file);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

檔案中內容:hello你好
控制檯輸出:hello���

而轉換流可以指定檔案的編碼方式,從而解決問題

InputStreamReader

InputStreamReader:Reader的子類,將位元組輸入流轉換為字元輸入流。是位元組流通向字元流的橋樑。如果不指定字元集編碼,該解碼過程將使用平臺預設的字元編碼,如:GBK。

該類提供了4個構造方法,根據不同的場景進行選擇操作

InputStream:表示位元組輸入流charset:表示編碼方式

傳入一個InputStream物件,而且可以指定處理的編碼方式

範例

位元組流FileInputStream包裝成(轉換流)字元流InputStreamReader,對檔案進行讀取(按照UTF-8格式),進而包裝成BufferedReader
讀取E槽下的檔案(read方法)

import java.io.*;

public class InputStreamReader_ {
    public static void main(String[] args) {
        String filePath = "E:\a.txt";
        BufferedReader bufferedReader = null;
        try {
            InputStreamReader gbk = new InputStreamReader(new FileInputStream(filePath), "GBK");
            bufferedReader = new BufferedReader(gbk);
            //下面為第二種寫法,通常使用第二種
            //bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath),"GBK"));
            String s;
            while ((s = bufferedReader.readLine()) != null) {
                System.out.println(s);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedReader.close();//關閉外層流即可
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

此時檔案本體的編碼為ANSI,所以如果不按照GBK編碼方式進行讀取,則採用預設編碼方式,會產生亂碼

OutputStreamWriter

OutputStreamWriter:Writer的子類,將位元組輸出流轉換為字元輸出流。是字元流通向位元組流的橋樑。如果不指定字元集編碼,該解碼過程將使用平臺預設的字元編碼,如:GBK。

該類提供了4個構造方法,根據不同的場景進行選擇操作

  • OutputStream:表示位元組輸出流
  • Charset:表示編碼格式

範例

寫入資料到E槽下的檔案(write方法)

import java.io.*;

public class OutputStreamWriter_ {
    public static void main(String[] args) {
        String filePath = "E:\test.txt";
        OutputStreamWriter utf8 = null;
        try {
            utf8 = new OutputStreamWriter(new FileOutputStream(filePath), "UTF8");
            try {
                utf8.write("hello世界");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                utf8.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("按照utf-8儲存檔案成功");
        }
    }
}

此時E槽下的test.txt檔案的內容為UTF-8編碼格式

當處理純文字資料時,如果使用字元流效率更高,並且可以有效解決中文問題,所以建議將位元組流轉換為字元流,使用的時候可以指定相應的編碼格式。(如:UTF-8,GBK,GB2312,ISO8859-1等)

到此這篇關於Java轉換流(InputStreamReader/OutputStreamWriter)的使用的文章就介紹到這了,更多相關Java轉換流內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com