【IO编程】4.节点流和处理流

时间:2021-07-21
本文章向大家介绍【IO编程】4.节点流和处理流,主要包括【IO编程】4.节点流和处理流使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. 基本介绍

  1. 节点流是从一个特定的数据源读写数据,如FileReader、FileInputStream
  2. 处理流也叫包装流,对已存在的流(节点流或处理流)进行包装,提供更强大的读写功能,如:BuffededReader、BufferedInputStream

2. 节点流和处理流的划分

3. 节点流和处理流的异同

  1. 节点流是底层流,直接跟数据源连接。
  2. 处理流使用了装饰器设计模式,对节点流进行包装。
  3. 处理流包装节点流,可以消除不同节点流的实现差异,提供统一的接口完成输入输出。

4. 处理流的优势

  1. 提高性能:增加了缓冲的方式提高输入输出的效率。
  2. 操作便捷:提供多个方法来一次输入输出大批量数据,使用灵活。

5. BufferedReader介绍

  • 构造方法
    • BufferedReader(Reader in, int sz)
      • in: 节点流或处理流的字符输入流对象
      • sz: 缓存大小
    • BufferedReader(Reader in)
      • 使用默认缓存大小8192
  • 成员方法
    • String readLine()
      • 读取一行,忽略最后的"\n"
    • void close()
      • 调用处理流的close()方法时会调用字节流的close()方法

使用BufferedReader读取文本文件,代码如下:

@Test
public void readFile() {
    BufferedReader br = null;
    String line;
    try {
        br = new BufferedReader(new FileReader("e:\\test.txt"));
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

6. BufferedWriter介绍

  • 构造方法

    • BufferedWriter(Writer out, int sz)
      • out: 节点流或处理流字符输出流对象
      • sz: 缓存大小
    • BufferedWriter(Writer out)
      • 使用默认缓存大小8192
  • 成员方法

    • void write(String str)
    • void write(String str, int off, int len)
      • 将字符串写入文件
    • void newLine()
      • 插入一个和系统相关的换行符
    • void close()
      • 调用处理流的close()方法时会调用字节流的close()方法
@Test
public void writeFile() {
    BufferedWriter bw = null;
    try {
        bw = new BufferedWriter(new FileWriter("e:\\test.txt"));
        bw.write("hello, world");
        bw.newLine();
        bw.write("hello, java");
        bw.newLine();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bw != null) {
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

7. 使用BufferedReader和BufferedWriter实现文本文件拷贝

此方法只适用于文本文件拷贝,用于二进制文件拷贝会损坏文件。代码如下:

public boolean copyFile(String sourceFilePath, String destFilePath) {
    boolean success = false;
    BufferedReader br = null;
    BufferedWriter bw = null;
    String line;
    try {
        br = new BufferedReader(new FileReader(sourceFilePath));
        bw = new BufferedWriter(new FileWriter(destFilePath));
        while ((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
        }
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (br != null) {
                br.close();
            }
            if (bw != null) {
                bw.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return success;
}

8. BufferedInputStream介绍

  • 构造方法
    • BufferedInputStream(InputStream in, int size)
      • in: 节点流或处理流的字节输入流对象
      • size: 缓存大小
    • BufferedInputStream(InputStream in)
      • 使用默认缓存大小8192
  • 成员方法
    • int read(byte[] buf)
      • 批量读取字节到数组中,返回读取到的字节数,如果到文件末尾返回-1
    • int read()
      • 读取一个字节
    • void close()
      • 调用处理流的close()方法时会调用字节流的close()方法

9. BufferedOutputStream介绍

  • 构造方法
    • BufferedOutputStream(OutputStream out, int size)
      • out: 节点流或处理流的字节输出流对象
      • size: 缓存大小
    • BufferedOutputStream(OutputStream out)
      • 使用默认缓存大小8192
  • 成员方法
    • void write(int b)
      • 写入一个字节
    • void write(byte[] b, int off, int len)
      • 写入指定数组的指定部分,以索引off开始,长度为len
    • void close()
      • 调用处理流的close()方法时会调用字节流的close()方法

10. 使用BufferedInputStream和BufferedOutputStream实现文件拷贝

实现思路与BufferedReader和BufferedWriter基本一致,代码如下:

public boolean copyFile(String sourceFilePath, String destFilePath) {
    boolean success = false;
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    byte[] buffer = new byte[8192];
    int readLength = 0;
    try {
        bis = new BufferedInputStream(new FileInputStream(sourceFilePath));
        bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
        while ((readLength = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, readLength);
        }
        success = true;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bis != null) {
                bis.close();
            }
            if (bos != null) {
                bos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return success;
}

原文地址:https://www.cnblogs.com/haojinglei/p/15039254.html