热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IO流——字符流BufferedReader/BufferedWriter进行文件读写

目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf

目录

  • 节点流、处理流
    • 读文件:BufferedReader 的使用
    • 写文件:BufferedWriter 的使用
      • 节点流
      • 处理流
      • 节点流和处理流的区别和联系
      • 字符流 BufferedReader / BufferedWriter 拷贝文本文件练习
        • 字符流 BufferedReader / BufferedWriter 用来拷贝文本文件,拷贝二进制文件(图片、音乐、视频、压缩包等都是二进制文件)会出错!!!
      • 字节流 BufferedOutputStream / BufferedInputStream 拷贝二进制文件
        • 字节流既可以拷贝二进制文件,也可以拷贝文本文件


节点流、处理流

在这里插入图片描述

读文件:BufferedReader 的使用


package day06.reader;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;/*** @Author: Gin* @Description: 演示 BufferedReader 的使用* @Modified By: Gin* @Date: Created in 9:07 2021/9/3*/
public class Demo {public static void main(String[] args) throws IOException {String filePath = "E:\\news3.txt";BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));String line; // 按行读取,效率高// 1. BufferedReader.readLine() 是按行读取// 2. 当读取到 null 时,表示读取完成while((line = bufferedReader.readLine()) != null){System.out.println(line);}// 关闭流,这里只需要关闭 BufferedReader,因为底层会自动关闭节点流/*public void close() throws IOException {synchronized (lock) {if (in == null)return;try {in.close(); // 这里的 in,就是我们传入的 new FileReader(filePath)} finally {in = null;cb = null;}}}*/bufferedReader.close();}
}

写文件:BufferedWriter 的使用


package day06.reader;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;/*** @Author: Gin* @Description:* @Modified By: Gin* @Date: Created in 9:19 2021/9/3*/
public class Demo2 {public static void main(String[] args) throws IOException {String filePath = "E:\\news4.txt";// 1. new FileWriter(filePath, true):表示追加写// 2. new FileWriter(filePath):表示覆盖写BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true));bufferedWriter.write("Gin");// 插入一个换行bufferedWriter.newLine();bufferedWriter.write("Vodka");// 插入一个换行bufferedWriter.newLine();bufferedWriter.write("Vermouth");// 插入一个换行bufferedWriter.newLine();bufferedWriter.close();}
}

在这里插入图片描述

节点流

节点流可以从一个特定的数据源读写数据,如 FileReaderFileWriter。节点流是比较底层的流,直接操作数据源。例:

在这里插入图片描述

处理流

处理流(也叫包装流),是 “ 连接 ” 在已存在的流(节点流或处理流)之上,为程序提供更为强大的读写功能,也更加灵活,如 BufferedReaderBufferedWriter
在这里插入图片描述

  • 为了使处理流的功能更加强大,在处理流(包装流)的底层对 节点流 进行了封装:

  • BufferedReader 为例: BufferedReader 类中,有属性 Reader ,即:可以封装一个节点流,只要是 Reader 的子类即可,而 Reader 的子类有很多,这样一来就大大加强了流的功能。【这种设计模式称之为修饰器模式

  • 在这里插入图片描述

  • 在这里插入图片描述

  • BufferedWriter 同理

  • 在这里插入图片描述

  • 在这里插入图片描述


节点流和处理流的区别和联系


  1. 节点流是 底层流 / 低级流 ,直接跟数据源相接。
  2. 处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。
  3. 处理流(包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连 【模拟修饰器设计模式】
  4. 模拟修饰器设计模式

字符流 BufferedReader / BufferedWriter 拷贝文本文件练习


字符流 BufferedReader / BufferedWriter 用来拷贝文本文件,拷贝二进制文件(图片、音乐、视频、压缩包等都是二进制文件)会出错!!!


package day06.reader;import java.io.*;/*** @Author: Gin* @Description: 利用处理流实现文件拷贝* @Modified By: Gin* @Date: Created in 9:31 2021/9/3*/
public class CopyTest {public static void main(String[] args) {// 1. BufferedReader 和 BufferedWriter 是按照字符操作的// 2. 不要去操作二进制文件,可能造成文件损坏String srcFile = "E:\\imgs";String destFile = "E:\\imgs2";BufferedReader br = null;BufferedWriter bw = null;try {br = new BufferedReader(new FileReader(srcFile));bw = new BufferedWriter(new FileWriter(destFile));String line;while ((line = br.readLine()) != null){bw.write(line);bw.newLine();}System.out.println("拷贝完毕!");} catch (IOException e) {e.printStackTrace();} finally {try {if(br != null){br.close();}if(bw != null){bw.close();}} catch (IOException e) {e.printStackTrace();}}}
}

字节流 BufferedOutputStream / BufferedInputStream 拷贝二进制文件


字节流既可以拷贝二进制文件,也可以拷贝文本文件


package day06.reader;import java.io.*;/*** @Author: Gin* @Description: BufferedOutputStream / BufferedInputStream 拷贝二进制文件* @Modified By: Gin* @Date: Created in 9:50 2021/9/3*/
public class CopyTest2 {public static void main(String[] args) {String srcFile = "E:\\HBuilderX.3.1.22.20210709.zip";String destFile = "E:\\HBuilderX.3.1.22.20210709-2.zip";BufferedInputStream bis = null;BufferedOutputStream bos = null;try {bis = new BufferedInputStream(new FileInputStream(srcFile));bos = new BufferedOutputStream(new FileOutputStream(destFile));byte[] buf = new byte[1024];int readLen;while((readLen = bis.read(buf)) != -1){bos.write(buf, 0, readLen);}System.out.println("拷贝完成!");} catch (IOException e) {e.printStackTrace();} finally {try{if(bis != null){bis.close();}if(bos != null){bos.close();}}catch(IOException e){e.printStackTrace();}}}
}


推荐阅读
author-avatar
邵世以_806
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有