字符流/节点流(FileReader、FileWriter)

上一篇字符流(InputStreamReader、OutputStreamWriter) - 鹿先森JIAN - 博客园 (cnblogs.com)对纯文本文件txt的读写复制操作,可针对不同编码进行转换设置。如果是默认的读写的文本文件的编码要与当前环境的编码兼容,可采用以下更简便的方法去写:

FileReader字符流,输入流,节点流。用来以字符为单位读取文件内容

FileWrtier字符流,输出流,节点流。用来以字符为单位把数据保存到文件中

注意:
以 Reader 结尾的这些字符流只能读写纯文本文件txt
FileReader、FileWriter 读写的文本文件的编码要与当前环境的编码兼容

 

--------------------------------------------------

FileReader

  • FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader
  • FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader
//使用FileReader读取文本文件的内容
public class Test01 {
    public static void main(String[] args) throws IOException {
        //1)建立流通道
        //out.txt文件是GBK编码,以FileReader读取,汉字会出现乱码
//        FileReader fr = new FileReader("D:\\yexiao1793\\file\\out.txt");
        //Test02.txt文件中既有中文又有英文, 该文件是以UTF-8编码的
        FileReader fr = new FileReader("D:\\yexiao1793\\file\\Test02.txt");

        //2)逐个字符读取. read()一次读取一个字符,返回字符的码值,如果读取文件末尾返回-1
        int cc = fr.read();
        while (cc != -1 ){
            System.out.print( (char)cc );
            cc = fr.read();
        }

        //3)关闭
        fr.close();
    }
}

FileWriter

  • FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象
  • FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象
// FileWriter 把字符保存到文件中
public class Test02 {
    public static void main(String[] args) throws IOException {
        //1)以覆盖的方式建立流通道,如果文件已存在,会覆盖文件原来的内容.如果文件不存在,会创建的新文件且编码格式就是UTF-8编码
        FileWriter fw = new FileWriter("D:\\yexiao1793\\file\\out3.txt");
        // out.txt文件已存在, 并且是GBK编码, 以覆盖的方式打开,会把文件编码更改为UTF-8
//        FileWriter fw = new FileWriter("D:\\yexiao1793\\file\\out.txt");
        // out.txt文件已存在, 并且是GBK编码, 以追加的方式打开,写入文件中的汉字会变为乱码
//        FileWriter fw = new FileWriter("D:\\yexiao1793\\file\\out.txt", true );

        fw.write('汉');
        fw.write('字');
        fw.write( 98 );
        fw.write( 30098 );
        fw.write('\r');
        fw.write('\n');
        fw.write("hello动力节点".toCharArray());
        fw.write("\r\n还可以直接写一个字符串");

        fw.close();
    }
}

--------------------------------------------

//文本文件的复制
public class Test03 {
    public static void main(String[] args) {
        String srcFile = "D:\\yexiao1793\\code\\day0901\\src\\filereaderwriter\\Test03.java"; // 源文件
        String destFile = "d:/yexiao1793/file/test03.java"; // 新位置

        copyTextFile(srcFile, destFile);
    }

    //文本文件复制,使用字符数组作为容器,自动关闭流
    private static void copyTextFile(String srcFile, String destFile) {
        try (
                FileReader reader = new FileReader(srcFile);
                FileWriter writer = new FileWriter(destFile);
        ) {
            char [] contents = new char[1024*4];
            int len = reader.read(contents); // 以字符数组方式读写
            while (len != -1 ){
                writer.write(contents, 0, len);
                len = reader.read(contents);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //文本文件复制,逐个字符复制,手动关闭流
    private static void copyTextFile1(String srcFile, String destFile) {
        FileReader reader = null;
        FileWriter writer = null;
        try {
            reader = new FileReader(srcFile);
            writer = new FileWriter(destFile);

            int cc = reader.read();
            while( cc != -1){
                writer.write(cc);
                cc = reader.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null ) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (writer!=null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

posted @ 2022-05-25 00:08  鹿先森JIAN  阅读(375)  评论(0编辑  收藏  举报