轉換流與打印流


編碼引出的問題

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

/*
FileReader可以讀取IDE默認編碼格式(UTF-8)的文件
FileReader讀取系統默認編碼(中文GBK)會產生亂碼���
 */
public class new01 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("D:\\environment\\java_project\\javase\\我是GBK格式文件.txt"));
        int len=0;
        while ((len=br.read())!=-1){
            System.out.println((char) len);
        }
        br.close();
    }
}

轉換流

轉換流原理

OutputStreamWriter

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
java.io.OutputStreamWriter extends Writer
OutputStreamWriter:是字符流通向字節流的橋梁:可使用指定的charset將要寫入流中的字符編碼成字節。(編碼:把能看懂的編程看不懂的)

繼承自父類的共性成員方法:
    - void write(int c) 寫入單個字符
    - void write(char[] cbuf) 寫入字符數組
    - abstract void write(char[] cbuf, int off, int len) 寫入字符數組的某一部分,off數組的開始索引,len寫的字符個數
    - void write(String str) 寫入字符串
    - void write(String str, int off, int len) 寫入字符串的某一部分,off字符串的開始索引,len寫的字符個數
    - void flush() 刷新該流的緩沖
    - void close() 關閉此流,但要先刷新它
構造方法:
    OutputStreamWriter(OutputStream out) 創建使用默認字符編碼的 OutputStreamWriter
    OutputStreamWriter(OutputStream out, String charsetName) 創建使用指定字符集的 OutputStreamWriter
    參數:
        OutputStream out:字節輸出流,可以用來寫轉換之后的字節到文件中
        String charsetName:指定的編碼表名稱,不區分大小寫,可以是utf-8/UTF-8,gbk/GBK,...不指定默認使用UTF-8
使用步驟:
    1.創建OutputStreamWriter對象,構造方法中傳遞字節輸出流和指定的編碼表名稱
    2.使用OutputStreamWriter對象中的方法write,把字符轉換為字節存儲緩沖區中(編碼)
    3.使用OutputStreamWriter對象中的方法flush,把內存緩沖區中的字節刷新到文件中(使用字節流寫字節的過程)
    4.釋放資源
 */
public class Demo01OutputStreamWriter {
    public static void main(String[] args) throws IOException {
        write_utf_8();
    }
/*
使用轉換流OutputStreamWriter寫UTF-8格式的文件
 */
    private static void write_utf_8() throws IOException {
        //1.創建OutputStreamWriter對象,構造方法中傳遞字節輸出流和指定的編碼表名稱
        //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "utf-8");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "GBK");
        //2.使用OutputStreamWriter對象中的方法write,把字符轉換為字節存儲緩沖區中(編碼)
        osw.write("你好");
        //3.使用OutputStreamWriter對象中的方法flush,把內存緩沖區中的字節刷新到文件中(使用字節流寫字節的過程)
        osw.flush();
        //4.釋放資源
        osw.close();
    }
}

InputStreamReader

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/*
java.io.InputStreamReader extends Reader
InputStreamReader:是字節流通向字符流的橋梁:它使用指定的charset讀取字節並將其解碼為字符。(解碼:把看不懂的變成能看懂的)

繼承自父類的共性成員方法:
    int read()讀取單個字符並放回
    int read(char[] cubf)一次讀取多個字符,將字符讀入數組
    void close()關閉該流並釋放與之關聯的所有資源
構造方法:
    InputStreamReader(InputStream in) 創建一個使用默認字符集的InputStreamReader
    InputStreamReader(InputStream in, String charsetName) 創建使用指定字符集的InputStreamReader
    參數:
        InputStream in:字節輸入流,用來讀取文件中保存的字節
        String charsetName:指定的編碼表名稱,不區分大小寫,可以是utf-8/UTF-8,gbk/GBK,...不指定默認使用UTF-8
使用步驟:
    1.創建InputStreamReader對象,構造方法中傳遞字節輸入流和指定的編碼表名稱
    2.使用InputStreamReader對象中的方法read讀取文件
    3.釋放資源
注意事項:
    構造方法中指定的編碼表名稱要和文件的編碼相同,否則會發生亂碼
 */
public class Demo02InputStreamReader {
    public static void main(String[] args) throws IOException {
        read_utf_8();

    }

    /*
    使用InputStreamReader讀取UTF-8格式的文件
     */
    private static void read_utf_8() throws IOException {
        //1.創建InputStreamReader對象,構造方法中傳遞字節輸入流和指定的編碼表名稱
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "UTF-8");
        //2.使用InputStreamReader對象中的方法read讀取文件
        int len = 0;
        while ((len = isr.read())!=-1){
            System.out.println((char)len);
        }
        //3.釋放資源
        isr.close();
    }
}

轉換文件編碼

/*
練習:轉換文件編碼
    將GBK編碼的文本文件,轉換為UTF-8編碼的文本文件
    
分析:
    1.創建InputStreamReader對象,構造方法中傳遞字節輸入流和指定的編碼表名稱GBK
    2.創建OutputStreamWriter對象,構造方法中傳遞字節輸出流和指定的編碼表名稱UTF-8
    3.使用InputStreamReader對象中的方法read讀取文件
    4.使用OutputStreamWriter對象中的方法write,把讀取的數據寫入到文件中
    5.釋放資源
 */
import java.io.*;

public class Demo03Test {
    public static void main(String[] args) throws IOException {
        read_GBK();
    }

    private static void read_GBK() throws IOException {
        //1.創建InputStreamReader對象,構造方法中傳遞字節輸入流和指定的編碼表名稱GBK
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "utf-8");
        //2.創建OutputStreamWriter對象,構造方法中傳遞字節輸出流和指定的編碼表名稱UTF-8
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\GBK.txt"), "GBK");
        // 3.使用InputStreamReader對象中的方法read讀取文件
        int len = 0;
        while ((len = isr.read())!=-1){
            //4.使用OutputStreamWriter對象中的方法write,把讀取的數據寫入到文件中
            osw.write(len);
        }
        //5.釋放資源
        osw.close();
        isr.close();
    }
}

打印流(write,println,System.setOut)

import java.io.FileNotFoundException;
import java.io.PrintStream;

/*
java.io.PrintStream:打印流
    PrintStream 為其他輸出流添加了功能,使它們能夠方便的打印各種數據值表示形式
PrintStream特點:
    1.只負責數據的輸出,不負責數據的讀取
    2.與其他輸出流不同,PrintStream永遠不會拋出IOException
    3.有特有的方法,print,println
        void print(任意類型的值)
        void println(任意類型的值並換行)
構造方法:
    PrintStream(File file):輸出的目的地是一個文件
    PrintStream(OutputStream out):輸出的目的地是一個字節輸出流
    PrintStream(String fileName):輸出的目的地是一個文件路徑
PrintStream extends OutputStream
繼承自父類的成員方法:
    - public void close():關閉此輸出流並釋放與此流相關聯的任何系統資源
    - public void flush():刷新此輸出流並強制任何緩沖的輸出字節被寫出
    - public void write(byte[] b):將b.length字節從指定的字節數組寫入此輸出流
    - public void write(byte[] b, int off, int len):從指定的字節數組寫入len字節,從偏移量off開始輸出到此輸出流
    - public abstract void write(int b):將指定的字節輸出流
注意:
    如果使用繼承自父類的write方法寫數據,那么查看數據的時候會查詢編碼表  97-->a
    如果使用自己特有的方法print/println方法寫數據,寫的數據原樣輸出  97-->97
 */
public class Demo01PrintStream {
    public static void main(String[] args) throws FileNotFoundException {
        //System.out.println("HelloWorld");

        //創建打印流PrintStream對象,構造方法中要綁定要輸出的目的地
        PrintStream ps = new PrintStream("D:\\environment\\java_project\\javase\\目的地是打印流.txt");
        //如果使用繼承自父類的write方法寫數據,那么查看數據的時候會查詢編碼表  97->a
        ps.write(97);
        //如果使用自己特有的方法print/println方法寫數據,寫的數據原樣輸出  97-->97
        ps.println(97);
        ps.println(8.8);
        ps.println('a');
        ps.println("HelloWorld");
        ps.println(true);

        //釋放資源
        ps.close();
    }
}
=============================================================================
import java.io.FileNotFoundException;
import java.io.PrintStream;

/*
可以改變輸出語句的目的地(打印流的流向)
輸出語句,默認在控制台輸出
使用System.setOut方法改變輸出語句的目的地改為參數中傳遞的打印流的目的地
    static void setOut(PrintStream out)
        重新分配“標准”輸出流
 */
public class Demo02PrintStream {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("我是在控制台輸出");

        PrintStream ps = new PrintStream("D:\\environment\\java_project\\javase\\目的地是打印流.txt");
        System.setOut(ps);
        System.out.println("我在打印流的目的地中輸出");

        ps.close();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM