热门标签 | 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();}}}
}


推荐阅读
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • 在Java开发中,如何利用ProcessBuilder类调用外部程序是一个常见的需求。本文将详细介绍ProcessBuilder类的使用方法,并提供示例代码帮助你更好地理解和应用。 ... [详细]
  • 本文介绍了如何在Linux系统中获取库源码,并在从源代码编译软件时收集所需的依赖项列表。 ... [详细]
  • 本文介绍了如何在 MapReduce 作业中使用 SequenceFileOutputFormat 生成 SequenceFile 文件,并详细解释了 SequenceFile 的结构和用途。 ... [详细]
  • 关于进程的复习:#管道#数据的共享Managerdictlist#进程池#cpu个数1#retmap(func,iterable)#异步自带close和join#所有 ... [详细]
  • 在使用Python 3.x的argparse模块时,如果输入参数中包含&符号,会遇到解析错误。本文介绍了如何解决这一问题,确保输入参数能够正确解析。 ... [详细]
  • 本文介绍了如何使用 Gesture Detector 和 overridePendingTransition 方法来实现滑动界面和过渡动画。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • iOS snow animation
    CTSnowAnimationView.hCTMyCtripCreatedbyalexon1614.Copyright©2016年ctrip.Allrightsreserved.# ... [详细]
  • android开发分享荐                                                         Android思维导图布局:效果展示及使用方法
    思维导图布局的前身是树形布局,对树形布局基本使用还不太了解的朋友可以先看看我写的树形布局系列教程,了解了树形布局的使用方法后再来阅读本文章。先睹为快来看看效果吧,横向效果如下:纵向 ... [详细]
  • 尽管没有绝对完美的程序,但追求代码的优雅和高效是我们不断努力的方向。本文将重点探讨Java中的try-with-resources语句,如何正确使用这一特性来管理资源。 ... [详细]
  • 本文介绍了如何在Spring框架中使用AspectJ实现AOP编程,重点讲解了通过注解配置切面的方法,包括方法执行前和方法执行后的增强处理。阅读本文前,请确保已安装并配置好AspectJ。 ... [详细]
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社区 版权所有