博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine...
阅读量:5877 次
发布时间:2019-06-19

本文共 6538 字,大约阅读时间需要 21 分钟。

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine


我们继续IO上个篇幅讲

一.文本复制

读写都说了,我们来看下其他的操作,我们首先来看复制

  • 复制原理:其实就是将C盘下的文件数据存储到D盘的一个文件中

实现的步骤:

1.在D盘创建一个文件,用于存储文件中的数据
2.定义读取流和文件关联
3.通过不断的读写完成数据的存储
关闭资源

package com.lgl.hellojava;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class HelloJJAVA {
public static void main(String[] args) { copy_1(); copy_2(); } // 从c盘读一个字符,就往D盘写一个字符 public static void copy_1() { try { // 创建目的地 FileWriter fw = new FileWriter("copy_1.txt"); // 与已有文件关联 FileReader fr = new FileReader("copy_1.txt"); int ch = 0; while ((ch = fr.read()) != -1) { // 读一个 写一个 fw.write(ch); } fw.close(); fr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void copy_2() { FileWriter fw = null; FileReader fr = null; try { fw = new FileWriter("copy_2.txt"); fr = new FileReader("copy_2.txt"); char[] buf = new char[1024]; int len = 0; while ((len = fr.read(buf)) != -1) { fw.write(buf, 0, len); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fw != null) { try { fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}

这里做了两种方式的拷贝方式,其实都是整理好思路,读和写的一个过程罢了!

二.字符流的缓冲区

字符流的缓冲区,提高了对数据的读写效率,他有两个子类

  • BufferedWriter
  • BufferedReader

缓冲区要结合柳才可以使用
在流的基础上对流的功能进行了增强

1.BufferedWriter

这里写图片描述

缓冲区的出现是提高流的效率而出现的,所以在创建缓冲区之前,必须先有流对象,我们看例子

package com.lgl.hellojava;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;public class HelloJJAVA {
public static void main(String[] args) { try { // 创建一个字符写入流对象 FileWriter fw = new FileWriter("buffer.txt"); // 为了提高写入流的效率加入了缓冲技术 BufferedWriter bufw = new BufferedWriter(fw); //写入数据 bufw.write("hello"); //换行 bufw.newLine(); //只要用到了缓冲区,就需要刷新 bufw.flush(); //缓冲区关闭的就是关联的流 bufw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

使用都是比较基础的,大家也是可以看到

2.BufferedReader

高效读取

这里写图片描述

我们直接看代码

package com.lgl.hellojava;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class HelloJJAVA {
public static void main(String[] args) { try { // 创建一个读取流对象和文件相关联 FileReader fr = new FileReader("buffer.txt"); // 为了提高效率,加入缓冲技术 BufferedReader bfr = new BufferedReader(fr); String line = null; while((line = bfr.readLine()) != null){ System.out.println(line); } bfr.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

这样就可以全部出来了

三.通过缓冲区复制文件

OK,我们还是复制文件这个问题,现在我们有缓冲区,我们要怎么样复制文件?

package com.lgl.hellojava;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class HelloJJAVA {
public static void main(String[] args) { /** * 缓冲区文件复制 */ BufferedReader bufr = null; BufferedWriter bufw = null; try { bufr = new BufferedReader(new FileReader("buffer.txt")); bufw = new BufferedWriter(new FileWriter("buffercopy.txt")); String line = null; while((line = bufr.readLine()) != null){ bufw.write(line); } //关闭流 bufr.close(); bufw.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

这样,就可以复制文件了

四.readLine工作原理

我们注意到我们要使用这个方法readline,无论是读一行还是读多个字符,其实都是在硬盘上一个一个读取,所以最终使用的还是read方法一个读一个的方法

  • 其实他内存中有一个数组,你读完之后并没有立马读,而是临时存储起来,这就是缓冲区,

这里写图片描述

当读到换行,才去返回一行数据,就这样一行一行的读取,这就是他的工作原理

五.自定义readLine

我们了解了readLine的工作原理,那我们就可以尝试去更改他了,自定义一个怎么样?我们尝试一下

package com.lgl.hellojava;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;public class HelloJJAVA {
public static void main(String[] args) { /** * 自定义readLine */ FileReader fr; try { fr = new FileReader("buffer.txt"); MyBufferReader my = new MyBufferReader(fr); String line = null; while ((line = my.myReadLine()) != null) { System.out.println(line); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}class MyBufferReader { private FileReader fr; public MyBufferReader(FileReader fr) { this.fr = fr; } // 一次读取一行的方法 public String myReadLine() throws IOException { // 定义临时容器 StringBuilder sb = new StringBuilder(); int ch = 0; while ((ch = fr.read()) != -1) { if (ch == '\r') { continue; } else if (ch == '\n') { return sb.toString(); } else { sb.append((char) ch); } } if(sb.length() != 0){ return sb.toString(); } return null; } public void close() throws IOException { fr.close(); }}

仔细看实现思路,静静的看,没错,我们也是可以实现的,好的,我们本篇到这里也OK,算是结束了,我们下一篇继续会将IO的,毕竟这是一个大知识点!

有兴趣可以加群:555974449

你可能感兴趣的文章
Maven 传递依赖冲突解决(了解)
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
查看>>
[Spark][Python]Spark Join 小例子
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
大战设计模式【11】—— 模板方法模式
查看>>
springBoot介绍
查看>>
Intellij IDEA 快捷键整理
查看>>
Redis 通用操作2
查看>>
性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项
查看>>
11. Spring Boot JPA 连接数据库
查看>>
洛谷P2925 [USACO08DEC]干草出售Hay For Sale
查看>>
MapReduce工作原理流程简介
查看>>
那些年追过的......写过的技术博客
查看>>
小米手机解锁bootload教程及常见问题
查看>>
Python内置函数property()使用实例
查看>>
Spring MVC NoClassDefFoundError 问题的解决方法。
查看>>
CentOS 6.9配置网卡IP/网关/DNS命令详细介绍及一些常用网络配置命令(转)
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
C# 解决窗体闪烁
查看>>