Java IO流04:文件字符流和缓冲字符流

字符编码

当编码方式和解码方式不一致时,会出现乱码

  • ISO:包括ASCII码在内的一些西欧国家的文字符号
  • UTF-8:针对Unicode码表的可变长度字符编码(1~3个字节)
  • GBK:简体中文、扩充

文件字符流

FileReader子类

文件字符输入流,继承抽象父类字符输入流(InputStreamReader)

read()方法从流中以字符为单位读取数据,无论中文还是英文都能一次性读完

import java.io.FileReader;

public class Main{

    public static void main(String[] args) throws Exception {

        /**
         * 创建FileReader对象
         */
        FileReader file = new FileReader("d:\\in.txt");

        int data;

        /**
         * 每次读取一个字符,无论中文还是英文都能一次性读完
         */
        while ((data = file.read()) != -1){
            System.out.print((char) data);
        }

        int count;

        /**
         * 自定义缓冲区时,创建的数组是字符数组
         */
        char[] ch = new char[1024];

        while ((count = file.read(ch)) != -1){
            System.out.println(new String(ch, 0, count));
        }

        file.close();
    }
}

FileWriter子类

文件字符输出流,继承抽象父类字符输出流(OutputStreamWriter)

write()方法从流中以字符为单位写入数据,无论中文还是英文都能一次性写完

import java.io.FileWriter;

public class Main{

    public static void main(String[] args) throws Exception {

        /**
         * 创建FileWriter对象
         */
        FileWriter file = new FileWriter("d:\\out.txt");

        /**
         * 每次读取一个字符,无论中文还是英文都能一次性读完
         */
        file.write("java是最好的编程语言");
        
        file.close();
    }
}

练习:复制文件

注意:字符流只能传输文本,不能传输图片、文件等二进制文件

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

public class Main{

    public static void main(String[] args) throws Exception {

        FileReader in = new FileReader("d:\\in.txt");
        FileWriter out = new FileWriter("d:\\out.txt");

        int data;

        while ((data = in.read()) != -1){
            out.write(data);
        }

        in.close();
        out.close();
    }
}

缓冲字符流(增强文件字符流)

BufferedReader子类

缓冲字符输入流,继承抽象父类输入流(Reader)

以其他字符输入流作为参数,先将数据存储在缓冲区中(8K),提高IO效率,减少访问磁盘的次数

但是read()方法还是只能读取一个字符

readLine()方法可以读取一行

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

public class Main{

    public static void main(String[] args) throws Exception {

        FileReader re = new FileReader("d:\\in.txt");
        BufferedReader buffer = new BufferedReader(re);

        /**
         * read()方法
         */
        int count;

        char[] ch = new char[1024];

        while ((count = buffer.read(ch)) != -1){
            System.out.println(new String(ch, 0, count));
        }

        /**
         * readLine()方法一次可以读取一行,此时返回值不是int而是String
         */
        String data = null;

        while ((data = buffer.readLine()) != null){
            System.out.println(data);
        }

        buffer.close();
    }
}

BufferedWriter子类

缓冲字符输出流,继承抽象父类输出流(Writer)

newLine()方法可以自动换行

import java.io.BufferedWriter;
import java.io.FileWriter;

public class Main{

    public static void main(String[] args) throws Exception {

        FileWriter re = new FileWriter("d:\\out.txt");
        BufferedWriter buffer = new BufferedWriter(re);

        for (int i = 0; i < 10; i++) {

            buffer.write("Main");
            
            /**
             * newLine()方法自动换行
             */
            buffer.newLine();
        }

        buffer.close();
    }
}
posted @ 2021-09-12 20:20  振袖秋枫问红叶  阅读(50)  评论(0)    收藏  举报