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

字符编码

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

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

文件字符流

FileReader子类

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

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

import java.io.FileReader;

public class Hello{
    public static void main(String[] args) throws Exception {
        //创建FileReader对象
        FileReader file = new FileReader("d:\\in.txt");
        int data = 0;
        //每次读取一个字符,无论中文还是英文都能一次性读完
//        while ((data = file.read()) != -1){
//            System.out.print((char)data);
//        }
        
        int count = 0;
        //自定义缓冲区时,创建的数组是字符类型
        char[] ch = new char[1024];
        while ((count = file.read(ch)) != -1){
            System.out.println(new String(ch, 0, count));
        }
        file.close();
    }
}

FileWriter子类

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

其write()方法从流中按字符一次性读取数据,无论中文还是英文都能一次性读完

import java.io.FileWriter;

public class Hello{
    public static void main(String[] args) throws Exception {
        //创建FileReader对象
        FileWriter file = new FileWriter("d:\\out.txt");
        //每次读取一个字符,无论中文还是英文都能一次性读完
        file.write("java是最好的编程语言");
        file.close();
    }
}

练习:复制文件

注意:字符流是不能传输图片、文件等二进制文件的

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

public class Hello{
    public static void main(String[] args) throws Exception {
        FileReader in = new FileReader("d:\\in.txt");
        FileWriter out = new FileWriter("d:\\out.txt");
        int data = 0;
        while ((data = in.read()) != -1){
            out.write(data);
        }
        in.close();
        out.close();
    }
}

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

BufferedReader子类

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

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

readLine()方法可以读取一行

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

public class Hello{
    public static void main(String[] args) throws Exception {
        FileReader re = new FileReader("d:\\in.txt");
        BufferedReader br = new BufferedReader(re);
//        int count = 0;
//        char[] ch = new char[1024];
//        while ((count = br.read(ch)) != -1){
//            System.out.println(new String(ch, 0, count));
//        }
		
        //readLine()方法可以按行打印,此时返回值不是int而是String
        String data = null;
        while ((data = br.readLine()) != null){
            System.out.println(data);
        }
        br.close();
    }
}

BufferedWriter子类

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

newLine()方法可以自动换行

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

public class Hello{
    public static void main(String[] args) throws Exception {
        FileWriter re = new FileWriter("d:\\out.txt");
        BufferedWriter br = new BufferedWriter(re);
        for (int i = 0; i < 10; i++) {
            br.write("Hello");
            //newLine()方法自动换行
            br.newLine();
        }
        br.close();
    }
}
上一篇:异常的处理方式之二:声明异常(throws子句)


下一篇:java流的处理