10Java的文件字符流

上一节在操作文件时使用的文件字节流(FileInputStream,FileOutputStream),但不同的编码方式可能会导致文件编码生成的字节数相差很大,所以对于文件操作可以使用文件字符流。

UTF-8:中文字3个字节,英文1个字节,数字1个字节

GBK:中文2个字节,英文1个字节,数字1个字节。

UTF-16LE:每个字符都是两个字节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lhaPpiVE-1617433462168)(E:(A)]PostgraduateFlies\JavaLearning\TyporaFiles\第二阶段\15Java的IO文件拷贝&文件流.assets\image-20210322160924029.png)

注意:文件字符流(FileReader,FileWriter)仅适合处理字符文件,也就是通常以一下的文件。

package IO_Study;

import java.io.*;

/**
 * 文件字符输出流FileWriter
 * 1.确定源
 * 2.选择流
 * 3.操作
 * 4.释放系统资源
 */
public class IOstudy06 {
    
    
    public static void main(String[] args) {
    
    
        //1.确定源
        File dest = new File("E:/(A)PostgraduateFlies/JavaLearning/
                             JavaProjects/TestingProjects/dest.txt");
        //2.选择流
        Writer writer = null;
        try {
    
    
            writer = new FileWriter(dest,false);//是否追加/覆盖写入的标志,这个标志是下一次run程序的时候起作用
            //3.操作
//            String str = "发达的范哈哈哈,hello/123";
//            char[] datas = str.toCharArray();//把字符串转换为字符数组
//            writer.write(datas, 0, datas.length);
            
//            writer.write("人民战争的汪洋大海123,party");
//            writer.flush();
            
            writer.append("法比本科\n").append("fsbdkjbvvkj");
            writer.flush();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
    
                if (null != writer) {
    
    
                    writer.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

需要说明的是:

  1. 操作文件字符流的步骤与操作文件字节流相同,思路相通;

  2. 由继承体系可知,FileReader类是InputStreamReader的子类,InputStreamReader类是Reader的子类,FileReader拥有Reader和InputStreamReader的所有方法和属性,所以读写的方式与文件字节输入输出流相同。

  3. 在写入文件的时候,有三种方式:

    writer = new FileWriter(dest,false);//是否追加/覆盖写入的标志
    //3.操作,方法一
    String str = "发达的范哈哈哈,hello/123";
    char[] datas = str.toCharArray();//把字符串转换为字符数组
    writer.write(datas, 0, datas.length);
    //方法二
    writer.write("人民战争的汪洋大海123,party");
    writer.flush();
    //方法三
    writer.append("法比本科\n").append("fsbdkjbvvkj");
    writer.flush();
    

    可以看到FileWriter类的爷爷类Writer的write方法如下:

    可以直接写入一个字符、字符串数组或者字符串,所以以上的三种方法都可以写入。

  4. 有一个注意点就是:在选择流的时候Writer writer = new FileWriter(dest,false);,这里的true或者false代表使用这个文件字符写入流写入的时候是覆盖写入还是追加写入。

但是关于这个布尔标志我发现了一个问题,如下,我这里设置的不可追加,但是运行完两句writer之后文件里面面却是追加写入的这两个字符串,不知道为何?

writer = new FileWriter(dest,false);
String str = "人民战争的汪洋大海123,party";
writer.write(str,0,5);
writer.write("\n不对劲巴洛克");
writer.flush();

经测试发现:这里追加(append)标识是在下一次运行程序的时候起作用,并不是在运行过程中起作用。

这是一个使用文件字符输入输出流进行文本文件的拷贝的程序:

package IO_Study;

import java.io.*;

/**
 * 使用文件字符输入流,文件字符输出流进行纯文本文件的拷贝
 * <p>
 * 1.确定源
 * 2.选择流
 * 3.操作
 * 4.释放系统资源
 */
public class IOstudy07 {
    
    
    public static void main(String[] args) {
    
    
        //1.确定源
        File src = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects/TestingProjects/src/IO_Study/abc.txt");
        File dest = new File("E:/(A)PostgraduateFlies/JavaLearning/JavaProjects/TestingProjects/dest.txt");
        //2.选择流
        Reader reader = null;
        Writer writer = null;
        try {
    
    
            //2.选择流
            reader = new FileReader(src);
            writer = new FileWriter(dest);
            //3.操作
            char[] flush = new char[1024];//每次读取1024个字符
            int len = -1;
            while ((len = reader.read(flush)) != -1) {
    
    
                writer.write(flush, 0, len);
                writer.flush();
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            try {
    
     //4. 释放系统资源
                if (null != writer) {
    
    /有可能文件字节流建立失败,所以要判断
                    writer.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            try {
    
    
                if (null != reader) {
    
    
                    reader.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/fada_is_in_the_way/article/details/115416328