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

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

时间: 2024-10-28 08:07:34

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

JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止

JAVA之旅(十五)--多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止 我们接着多线程讲 一.生产者和消费者 什么是生产者和消费者?我们解释过来应该是生产一个,消费一个,的意思,具体我们通过例子来说 package com.lgl.hellojava; //公共的 类 类名 public class HelloJJAVA { public static void main(String[] args) { /** * 生产者和消费者

JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了.如果你初学,不懂IO流,你可以从前往后慢慢看,但是你工作了一段时间你会发现,流的使用场景以及技术点是非常的强硬的,我们势必要掌握这个知识点,如果你觉得翻阅API比较鼓噪,看视频得不到精髓,看书看不到要点,你就跟随我的JAVA之旅,一起去探索吧! 一.I/O概述 I/O全名:Input Output

JAVA之旅(三十三)——TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录

JAVA之旅(三十三)--TCP传输,互相(伤害)传输,复制文件,上传图片,多并发上传,多并发登录 我们继续网络编程 一.TCP 说完UDP,我们就来说下我们应该重点掌握的TCP了 TCP传输 Socket和ServiceSocket 建立客户端和服务端 建立连接后,通过Socket中的IO流进行数据的传输 关闭Socket 同样的,我们的客户端和服务端都是两个独立的应用 我们通过查阅API文档发现,该对象在建立的时候,就可以去连接指定主机,因为tcp是面向连接的,所以在建立socket服务时,

JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一.Thread 如何在自定义的代码中,自定义一个线程呢? 我们查看API文档,我们要启动一个线程,先实现一个子类, package com.lgl.hellojava; public class MyThread extends Thread { @Override public void run()

(保存)C#基础概念二十五问

C#基础概念二十五问 注:本文部份资料来自网络,如有侵权,请与我联系,我会在第一时间声明引用或将其删除!     当初学 C# 时是找个人大概问了一下数据类型和分支语句就开始做项目了.这两天又全面的看了一下相关的基础知识(学而时习之嘛),总结了25个问题: 1.静态变量和非静态变量的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.sealed 修饰符是干什么的?7.over

JAVA之旅(十)——异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别

JAVA之旅(十)--异常的概述,Try-Catch,异常声明Throws,多异常处理,自定义异常,Throw和Throws的区别 不知不觉,JAVA之旅这个系列已经更新到第十篇了,感觉如梦如幻,时间过得很快,转眼一个月就这样过去了,我们不多说,继续我们的JAVA之旅 一.异常的概述 异常算是程序中一个比较重要的环节了,我们首先来看一下异常的体系,我们举一个小例子,定义一个除法方法 //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无返回值 main方

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十五)

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(二十五)完美捕捉精灵之神器 -- HitTest 怪物们都出现了,如何选中自己心仪的怪是主角目前首要做的事. 为了进行鼠标状态区别,我首先对鼠标变化规则进行约束:当鼠标在屏幕上空旷地图区域移动时,鼠标光标形态表现为默认光标 (0号光标图片),当鼠标经过精灵(悬停于其上方)时则变成发光光标(1号光标图片),如果指向的精灵对象为敌对状态时则鼠标光标变为攻击光标(2号光标图片),当使用魔法快捷键时,鼠标光标变成凝法状

JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时我们很常用的数据类型,他也是一个类的使用 我们来看 package com.lgl.hellojava; //公共的 类 类名 public class HelloJJAVA { public static void main(String[] args) { /** * String */ /**