IO之字符流

什么是字符流

对于文本文件(.txt .java .c .cpp) 使用字符流处理

注意点

  1. 读入的文件一定要存在 否则就会报FileNotFoundException
  2. 异常的处理 为了保证流资源 一定可以执行关闭操作 要使用try catch finally 来操作
  3. 写出的文件如果不存在 会自动创建
  4. 实例化FileWriter 处理File参数 还有append参数
    append :false 覆盖原有文件 append :true 在原有文件后面追加

示例

package day03;


import org.junit.Test;

import java.io.*;

/**
 * 一.流的分类
 * 1.  数据单位  :字节流 字符流
 * 2.  流向: 输入流 输出流
 * 3.  角色:节点流 处理流
 * <p>
 * 二.体系结构
 * 抽象基类                 节点流(或文件流)               缓冲流(处理流的一种)
 * InputStream              FileInputStream             BufferedInputStream
 * OutputStream             FileOutputStream            BufferedOutputStream
 * Reader                   FileReader                  BufferedReader
 * Writer                   FileWriter                  BufferedWriter
 */
public class FileReaderWriter {
    /**
     * 将 hello.txt 读取到 内存中 并输出到控制台 (一个一个读)
     * <p>
     * 异常的处理  为了保证流资源 一定可以执行关闭操作  要使用try catch finally 来操作
     * <p>
     * 读入的文件一定要存在 否则就会报FileNotFoundException
     */
    @Test
    public void testFileReader() {
        FileReader fileReader = null;
        try {
            // 1. 实例化file对象  确定要操作的文件
            File file = new File("08_IO\\hello");
            if (!file.exists()) {
                System.out.println("file不存在");
                return;
            }
            // 2. 提供具体的流
            fileReader = new FileReader(file);

            // 3. 数据的读入
            // read() 返回读入的一个字符 如果达到文件末尾 返回 -1
            int n;
            while ((n = fileReader.read()) != -1) {
                System.out.println((char) n);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileReader != null) {
                    // 4. 流的关闭  节省资源
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 使用read重载方法
     */
    @Test
    public void testFileReader1() {
        FileReader fileReader = null;
        try {
            // 1. File类的实例化
            File file = new File("08_IO\\hello");
            // 2. FileReader的实例化
            fileReader = new FileReader(file);
            // 3. 读入的操作
            char[] ch = new char[10];
            int len;
            while ((len = fileReader.read(ch)) != -1) {
                /*
                 * 错误的写法
                 * */
//                for (int i = 0; i < ch.length; i++) {
//                    System.out.print(ch[i]);
//                }

                /*
                 * 正确的写法
                 * 第一种写法
                 * */
//                for (int i = 0; i < len; i++) {
//                    System.out.print(ch[i]);
//                }

                // 第二种写法
                String string = new String(ch, 0, len);
                System.out.print(string);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4. 资源关闭
            try {
                if (fileReader != null) {
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 从内存写出到硬盘的文件里
     * <p>
     * 写出的文件如果不存在 会自动创建
     * 如果存在 对原有文件内容的覆盖
     */
    @Test
    public void testFileWriter() {
        FileWriter fileWriter = null;
        try {
            // 1. 实例化File类对象
            File file = new File("08_IO\\hello1");
            // 2.提供FileWriter 对象 用于数据的写出
            // append :false  覆盖原有文件
            // append :true  在原有文件后面追加
            fileWriter = new FileWriter(file, true);

            // 3. 写出的操作
            fileWriter.write("wwbao");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4. 关闭流操作
            try {
                if (fileWriter != null) {
                    fileWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 复制文件
     * <p>
     * 利用FileReader 读取文件
     * FileWriter 写入文件
     */
    @Test
    public void testFileReaderFileWriter() {
        FileWriter fw = null;
        FileReader fr = null;
        try {
            // 1. 创建File类对象
            File srcFile = new File("08_IO\\hello1");
            File destFile = new File("08_IO\\hello2");

            // 2. 创建FileReader 和 FileWriter对象
            fr = new FileReader(srcFile);
            fw = new FileWriter(destFile);

            // 3. 读取文件 写入文件
            char[] ch = new char[10];
            int len;
            while ((len = fr.read(ch)) != -1) {
                fw.write(ch, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4. 关闭资源
            try {
                if (fw != null) {
                    fw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                if (fr != null) {
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

小结

具体的操作跟字节流类似 实现类不同

对于文本文件(.txt .java .c .cpp) 使用字符流处理

对于非文本文件(.jpg .mp3 .mp4 .doc .ppt) 使用字节流处理

上一篇:ORACLE中seq$表更新频繁的分析


下一篇:FileReader读取txt文件