java中基础字符流使用

java中基础字符流使用

java中编码表编码解码

  • 中文的编码都是负数
  • UTF-8中每个中文字符占3个字节
  • GBK中每个中文字符占2个字节
  • 编码解码要使用统一的编码表
  • 默认使用UTF-8

字符串中编码解码

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

public class Demo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "中国";

        // 使用字符串的getBytes()方法编码为UTF-8字节码
        byte[] bytes = s.getBytes("UTF-8");
        // UTF-8中每个中文字符占3个字节
        // [-28, -72, -83, -27, -101, -67]
        System.out.println(Arrays.toString(bytes));

        // 使用字符串的getBytes()方法编码为GBK节码
        byte[] bytes1 = s.getBytes("GBK");
        // GBK中每个中文字符占2个字节
        // [-42, -48, -71, -6]
        System.out.println(Arrays.toString(bytes1));

        // 解码:此时bytes为UTF-8编码,bytes1为GBK编码
        // 使用String的构造函数进行解码
        String s1 = new String(bytes,"UTF-8");
        String s2 = new String(bytes1,"GBK");

        System.out.println(s1);
        System.out.println(s2);
    }
}

字符流中编码解码的基本使用

/*
* 字符流中编码解码
* 从字符流到字节流使用的类:
* InputStreamReader和OutputStreamWriter
* */

import java.io.*;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        /*
        * API:
        * OutputStreamWriter (OutputStream out,String charsetName)
        * InputStreamReader (InputStream out,String charsetName)
        * */

//        FileOutputStream fileOutputStream = new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt");
//        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK");
        // 合并为一步
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt"),"GBK");
        // 使用该对象的write()写入
        osw.write("中国");

        // 关闭资源
        osw.close();

        // 读取
        InputStreamReader isr = new InputStreamReader(new FileInputStream("java基础\\src\\com\\io\\encoding\\test.txt"), "GBK");

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

        // 关闭资源
        isr.close();

    }
}

字符流写数据的5种方式

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

public class Write {
    public static void main(String[] args) throws IOException{
        // 1.一次写一个字符
//        method1();
        // 2.一次写一个字符数组
//        method2();
        // 3.一次写一个字符数组的一部分
//        method3();
        // 4.一次写一个字符串
//        method4();
        // 5.一次写一个字符串的一部分
        method5();
    }

    /*
    * 构造函数源码:
    * public void write(int c) throws IOException {
        se.write(c);
    }

    /*
     * Writes a portion of an array of characters.
     *
     * @param  cbuf  Buffer of characters
     * @param  off   Offset from which to start writing characters
     * @param  len   Number of characters to write
     *
     * @exception  IOException  If an I/O error occurs
     *
    public void write(char cbuf[], int off, int len) throws IOException {
        se.write(cbuf, off, len);
    }

    /**
     * Writes a portion of a string.
     *
     * @param  str  A String
     * @param  off  Offset from which to start writing characters
     * @param  len  Number of characters to write
     *
     * @exception  IOException  If an I/O error occurs
     *
    public void write(String str, int off, int len) throws IOException {
        se.write(str, off, len);
    }

    /**
     * Flushes the stream.
     *
     * @exception  IOException  If an I/O error occurs
     **/

    public static void method1() throws IOException{
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt"));

        osw.write(97);
        osw.write(98);
        osw.write(99);

        // 因为字符流写数据会保存到缓冲区中,需要调用刷新流刷新
        // 调用刷新流
//        osw.flush();

        // 使用close会先进行自动刷新
        // 但是调用close()后就不能对此流进任何操作了
        osw.close();
    }
    public static void method2() throws IOException{
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt"));

        char[] chars = {'a','b','c','e','f','g'};
        osw.write(chars);

        osw.close();
    }
    public static void method3() throws IOException{
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt"));

        char[] chars = {'a','b','c','e','f','g'};
        // 从第1个开始,一共写5个
        osw.write(chars,0,4);

        osw.close();
    }
    public static void method4() throws IOException{
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt"));

        osw.write("你好");

        osw.close();
    }
    public static void method5() throws IOException{
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\test.txt"));

        osw.write("你好",0,1);

        osw.close();
    }
}

字符流读数据的2种方式

/*
* 字符流读数据的2种方式
* */

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

public class Read {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("java基础\\src\\com\\io\\encoding\\test.txt"));

        // 一次读取一个字符数据
//        method1(isr);
        // 一次读取一个字符数组
        method2(isr);

        isr.close();
    }

    // 一次读取一个字符数据
    public static void method1(InputStreamReader isr) throws IOException {

        int read;
        while ((read = isr.read()) != -1){
            System.out.print((char) read);
        }


    }
    // 一次读取一个字符数组
    public static void method2(InputStreamReader isr) throws IOException{

        char[] chars = new char[1024];
        int read;
        while ((read = isr.read(chars)) != -1){
            System.out.print(new String(chars,0,read));
        }
    }
}

实训:复制java文件

/*
* 将Before.java复制到Copy.java
* */

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        // 数据源
        InputStreamReader isr = new InputStreamReader(new FileInputStream("java基础\\src\\com\\io\\encoding\\copy\\Before.java"));
        // 目标
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("java基础\\src\\com\\io\\encoding\\copy\\Copy.java"));

        // 读取数据源
        char[] chars = new char[1024];
        int readLength;
        while ((readLength = isr.read(chars)) != -1){
            // 此时chars为读取的数据
            // 将其转换成字符串
            String read = new String(chars, 0, readLength);
            // 将读取的数据写入目标
            osw.write(read);
        }

        isr.close();
        osw.close();
    }
}

转换流的名字过于长,我们决定使用他们的子类对上述实训进行重构并学习

缺点是不能编码解码

/*
 *  使用子类FileReader和FileWriter
 *  将Before.java复制到Copy.java
 *  缺点是不能编码解码
 * */

import java.io.*;

public class Demo {
    public static void main(String[] args) throws IOException {
        /*
        * 构造函数源码:
        * public FileReader(String fileName) throws FileNotFoundException {
            super(new FileInputStream(fileName));
        }
        *
        * public FileWriter(String fileName) throws IOException {
            super(new FileOutputStream(fileName));
        }
        * */

        // 数据源
        FileReader fileReader = new FileReader("java基础\\src\\com\\io\\encoding\\newCopy\\Before.java");
        // 目标
        FileWriter fileWriter = new FileWriter("java基础\\src\\com\\io\\encoding\\newCopy\\Copy.java");

        // 读取数据源
        char[] chars = new char[1024];
        int readLength;
        while ((readLength = fileReader.read(chars)) != -1){
            fileWriter.write(chars,0,readLength);
        }

        // 关闭资源
        fileWriter.close();
        fileReader.close();
    }
}

posted @ 2022-02-02 21:40  CoderCatIce  阅读(47)  评论(0编辑  收藏  举报