字符输出流Writer和字符输入流Reader

1.字符串中的编码解码问题

字符串转字节 --编码

byte[] getBytes()

使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。

byte[] getBytes(Charset charset)

使用给定的charset将该String编码为字节序列,将结果存储到新的字节数组中。

字节转字符串 --解码

String(byte[] bytes)

通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。

String(byte[] bytes, Charset charset)

构造一个新的String由指定用指定的字节的数组解码charset 。

package com.itheima_01;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/*
    编码:
        byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
        byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中

    解码:
        String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
        String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
 */
public class StringDemo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //定义一个字符串
        String s = "中国";

        //byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
        //byte[] bys = s.getBytes(); //[-28, -72, -83, -27, -101, -67]
        //byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
//        byte[] bys = s.getBytes("UTF-8"); //[-28, -72, -83, -27, -101, -67]
        byte[] bys = s.getBytes("GBK"); //[-42, -48, -71, -6]
        System.out.println(Arrays.toString(bys));

        //String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
//        String ss = new String(bys);
        //String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String
//        String ss = new String(bys,"UTF-8");
        String ss = new String(bys,"GBK");
        System.out.println(ss);
    }
}

字符输出流Writer和字符输入流Reader

 

2.字符转换流

转换流输出流 OutputStreamWriter

    OutputStreamWriter:是从字符流到字节流的桥梁
        是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out, String charsetName)

创建一个使用默认字符编码的OutputStreamWriter。

char数组

字符输出流Writer和字符输入流Reader

void close()

关闭流,先刷新。

void flush()

刷新流。

package com.itheima_02;

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

/*
    构造方法:
        OutputStreamWriter​(OutputStream out):创建一个使用默认字符编码的OutputStreamWriter

    写数据的5种方式:
        void write​(int c):写一个字符
        void write​(char[] cbuf):写入一个字符数组
        void write​(char[] cbuf, int off, int len):写入字符数组的一部分
        void write​(String str):写一个字符串
        void write​(String str, int off, int len):写一个字符串的一部分
 */
public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {
        //OutputStreamWriter​(OutputStream out):创建一个使用默认字符编码的OutputStreamWriter
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"));

        //void write​(int c):写一个字符
//        osw.write(97);
//        //void flush():刷新流
//        osw.flush();
//        osw.write(98);
//        osw.flush();
//        osw.write(99);

        //void write​(char[] cbuf):写入一个字符数组
        char[] chs = {'a', 'b', 'c', 'd', 'e'};
//        osw.write(chs);

        //void write​(char[] cbuf, int off, int len):写入字符数组的一部分
//        osw.write(chs, 0, chs.length);
//        osw.write(chs, 1, 3);

        //void write​(String str):写一个字符串
//        osw.write("abcde");

        //void write​(String str, int off, int len):写一个字符串的一部分
//        osw.write("abcde", 0, "abcde".length());
        osw.write("abcde", 1, 3);

        //释放资源
        osw.close();
        //Exception in thread "main" java.io.IOException: Stream closed
//        osw.write(100);
    }
}

转换流输入流InputStreamReader

 InputStreamReader:是从字节流到字符流的桥梁
        它读取字节,并使用指定的编码将其解码为字符

创建一个使用命名字符集的InputStreamReader。

InputStreamReader(InputStream in)

创建一个使用默认字符集的InputStreamReader。

InputStreamReader(InputStream in, String charsetName)

package com.itheima_02;

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

/*
    构造方法:
        InputStreamReader​(InputStream in):创建一个使用默认字符集的InputStreamReader

    读数据的2种方式:
        int read​():一次读一个字符数据
        int read​(char[] cbuf):一次读一个字符数组数据
 */
public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        //InputStreamReader​(InputStream in):创建一个使用默认字符集的InputStreamReader
//        InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\osw.txt"));
        InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\ConversionStreamDemo.java"));

        //int read​():一次读一个字符数据
//        int ch;
//        while ((ch=isr.read())!=-1) {
//            System.out.print((char)ch);
//        }

        //int read​(char[] cbuf):一次读一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len = isr.read(chs)) != -1) {
            System.out.print(new String(chs, 0, len));
        }


        //释放资源
        isr.close();
    }
}

3.综合使用

package com.itheima_03;

import java.io.*;

/*
    需求:
        把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

    思路:
        1:根据数据源创建字符输入流对象
        2:根据目的地创建字符输出流对象
        3:读写数据,复制文件
        4:释放资源
 */
public class CopyJavaDemo01 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符输入流对象
        InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\ConversionStreamDemo.java"));
        //根据目的地创建字符输出流对象
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\Copy.java"));

        //读写数据,复制文件
        //一次读写一个字符数据
//        int ch;
//        while ((ch=isr.read())!=-1) {
//            osw.write(ch);
//        }

        //一次读写一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len=isr.read(chs))!=-1) {
            osw.write(chs,0,len);
        }

        //释放资源
        osw.close();
        isr.close();
    }
}

4. FileReader转换流 和FileWriter转换流 (比上面书写更简洁)  但不能更改编码方式

package com.itheima_03;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
    需求:
        把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

    数据源和目的地的分析
        数据源:myCharStream\\ConversionStreamDemo.java --- 读数据 --- Reader --- InputStreamReader --- FileReader
        目的地: myCharStream\\ Copy.java --- 写数据 --- Writer --- OutputStreamWriter --- FileWriter

    思路:
        1:根据数据源创建字符输入流对象
        2:根据目的地创建字符输出流对象
        3:读写数据,复制文件
        4:释放资源
 */
public class CopyJavaDemo02 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符输入流对象
        FileReader fr = new FileReader("myCharStream\\ConversionStreamDemo.java");
        //根据目的地创建字符输出流对象
        FileWriter fw = new FileWriter("myCharStream\\Copy.java");

        //读写数据,复制文件
//        int ch;
//        while ((ch=fr.read())!=-1) {
//            fw.write(ch);
//        }

        char[] chs = new char[1024];
        int len;
        while ((len=fr.read(chs))!=-1) {
            fw.write(chs,0,len);
        }

        //释放资源
        fw.close();
        fr.close();
    }
}

字符缓冲流

字符输出流Writer和字符输入流Reader

 方式一、按字节数组读

package com.itheima_04;

import java.io.*;

/*
    需求:
        把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

    思路:
        1:根据数据源创建字符缓冲输入流对象
        2:根据目的地创建字符缓冲输出流对象
        3:读写数据,复制文件
        4:释放资源
 */
public class CopyJavaDemo01 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
        //根据目的地创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));

        //读写数据,复制文件
        //一次读写一个字符数据
//        int ch;
//        while ((ch=br.read())!=-1) {
//            bw.write(ch);
//        }

        //一次读写一个字符数组数据
        char[] chs = new char[1024];
        int len;
        while ((len=br.read(chs))!=-1) {
            bw.write(chs,0,len);
        }

        //释放资源
        bw.close();
        br.close();
    }
}

方式二、按行读

package com.itheima_04;

import java.io.*;

/*
    需求:
        把模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

    思路:
        1:根据数据源创建字符缓冲输入流对象
        2:根据目的地创建字符缓冲输出流对象
        3:读写数据,复制文件
            使用字符缓冲流特有功能实现
        4:释放资源
 */
public class CopyJavaDemo02 {
    public static void main(String[] args) throws IOException {
        //根据数据源创建字符缓冲输入流对象
        BufferedReader br = new BufferedReader(new FileReader("myCharStream\\ConversionStreamDemo.java"));
        //根据目的地创建字符缓冲输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\Copy.java"));

        //读写数据,复制文件
        //使用字符缓冲流特有功能实现
        String line;
        while ((line=br.readLine())!=null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        //释放资源
        bw.close();
        br.close();
    }
}

上一篇:Java面向程序设计


下一篇:Java8的Stream语法详解(转载)