Java学习44-Java 流(Stream)、文件(File)和IO - BufferedInputStream \ BufferedOutputStream 缓冲流的使用

本文详细介绍了Java中BufferedInputStream和BufferedOutputStream缓冲流的作用、使用方法,以及如何利用它们高效地复制文件,同时提供了BufferedReader和BufferedWriter处理文本和非文本文件的实例。
摘要由CSDN通过智能技术生成

BufferedInputStream \ BufferedOutputStream 缓冲流

  1. 基础IO流的框架
抽象基类4个节点流(也称作文件流,之前学过的)4个缓冲流(处理流的一种)
InputStreamFileInputStreamBufferedInputStream
OutputStreamFileOutputStreamBufferedOutputStream
ReaderFileReaderBufferedReader
WriterFileWriterBufferedWriter
  1. 缓冲流的作用
    提升文件读写的效率。很多字节byte读入内存后,形成一个大信息块才整体向内存储空间传输,这样节省内存和存储空间交互的次数。

4个缓冲流 之 单一文字类使用的方法
处理文处理文本文件的字符流:
BufferedReaderread(char[] cBuffer) / 也可以读一行 String readLine()
BufferedWriterwrite(char[] cBuffer,0,len) / write(String)/flush()及时刷新内存读来的data,显示在屏幕上
4个缓冲流 之 不规则文件类使用的方法
处理非文本文件的字节流(音频图像之类的):
BufferedInputStreamread(byte[] buffer)
BufferedOutputStreamwrite(byte[] buffer,0,len) / flush()
  1. 实现的步骤

第1步:创建File的对象,流的对象(包括文件流,缓冲流)
第2步:使用缓冲流实现 读取数据 或 写出数据的过程(重点)

读取:int read(char[] cbuf/byte[] buffer) : 每次将数据读入到cbuf/buffer数组中,并返回读入到数组中

写出:void write(String str)/write(char[] cbuf):将str或cbuf写出到文件中
void write(byte[] buffer) 将byte[] 写出到文件中

第3步:关闭资源。

举例:使用BufferedInputStream \ BufferedOutputStream复制一个图片

程序示例如下:

package IOTest;

import org.junit.Test;

import java.io.*;

public class BufferedStreamTest {
    /*
    * 需要:使用BufferedInputStream \ BufferedOutputStream复制一个图片
    * test_photo1.jpeg
    * */
    public static void main(String[] args) throws IOException {
        File f1 = new File("test_photo1.jpeg");
        File f2 = new File("666cpy2_test_photo1.jpeg");

        FileInputStream fs_in = new FileInputStream(f1);
        FileOutputStream fs_out = new FileOutputStream(f2);

        BufferedInputStream bfs1 = new BufferedInputStream(fs_in);
        BufferedOutputStream bfs2 = new BufferedOutputStream(fs_out);

        byte [] cart =new byte[1024];
        int len = 0;
        /*
        * while((len=fs_in.read(cart))!=-1){
            fs_out.write(cart, 0, len);
        }
        *
        * */


        while((len = bfs1.read(cart))!=-1){
            bfs2.write(cart,0,len);
        }
        System.out.println("job done");

        //关闭流资源
        bfs2.close();
        bfs1.close();

        // 由于外层流的关闭会自动关闭内层流,
        // 所以下面这两句内存流关闭也可以不写
        fs_out.close();
        fs_in.close();
    }





}

运行结果:

job done

Process finished with exit code 0

示例2:尝试使用BufferedInputStream和FileInputStream读入并且分别复制一个视频(或者audio),比较一下他们的复制速度哪个更快。

package IOTest;

import java.io.*;
import java.sql.Timestamp;
import java.util.Date;

public class VideoCopyTimeTest {

    /*
     * 需要:使用BufferedInputStream \ BufferedOutputStream复制一个图片
     * test_photo1.jpeg
     * 用之前学习的FileInputStream和BufferedInputStream比较下下copy时间上的差异
     * */

    public static void main(String[] args) throws IOException {
        File f1 = new File("test_photo1.jpeg");
        File f2 = new File("12344_test_photo1.jpeg");
        FileInputStream fin = new FileInputStream(f1);
        FileOutputStream fout = new FileOutputStream(f2);
        int len = 0;
        byte[] cart =  new byte[10];
        Date d1 = new Date();

        long str1= d1.getTime();
        while((len=fin.read(cart)) != -1){
            fout.write(cart,0,len);
        }
        Date d2 = new Date();
        long done1 = d2.getTime();
        System.out.println("job done"+(done1-str1));
        fin.close();
        fout.close();







        File f11 = new File("test_photo1.jpeg");
        File f21 = new File("stream_12344_test_photo1.jpeg");
        FileInputStream fin1 = new FileInputStream(f11);
        FileOutputStream fout1 = new FileOutputStream(f21);
        BufferedInputStream buffin= new BufferedInputStream(fin1);
        BufferedOutputStream buffout= new BufferedOutputStream(fout1);
        int bufflen = 0;
        byte[] buffcart =  new byte[10];
        Date d11 = new Date();

        long str11= d11.getTime();
        while((bufflen=buffin.read(buffcart)) != -1){
            buffout.write(buffcart,0,bufflen);
        }
        Date d21 = new Date();
        long done11 = d21.getTime();
        System.out.println("job done"+(done11-str11));
        buffin.close();
        buffout.close();





    }
}


          

运行结果
可以观察到,用了 BufferedOutputStream 确实速度要快一些。

job done1463
job done92

Process finished with exit code 0

BufferedReader(读取文字使用)

举例:使用BufferedReader将sample1.txt中的内容复制在控制台上。

package IOTest;

import org.junit.Test;

import java.io.*;

public class BufferedReaderWriterTest {
    /*
    *
    * 使用BufferedReader将sample1.txt中的内容复制在控制台上。
    *
    * */


    public static void main(String[] args) throws IOException {

        //如果想省事儿也可以写成一行 BufferedReader bf1 = new BufferedReader(new FileReader(new File("sample1.txt")));

        File f1 = new File("sample1.txt");
        //FileReader fr1 = new FileReader(f1);
        //BufferedReader bf1 = new BufferedReader(fr1);


        BufferedReader bf1 = new BufferedReader(new FileReader(f1));
        char [] cart = new char[10];
        int len = 0;
        //方法1:
        /*
        while((len = bf1.read(cart))!= -1){
            for (int i = 0; i < len; i++) {
                System.out.print(cart[i]);
            }

        }
        */

        //方法2:
        /*
        while((len = bf1.read(cart))!= -1){
            System.out.print(cart);
        }
        */


        //方法3:

        /*
        *
        while((len = bf1.read(cart))!= -1){
            String st1 = new String(cart,0,len);
            System.out.print(st1);
        }
*/

        //方式4:使用readLine,每次读取一行,不带回车。注意readLine方法返回值为null说明全部读完了。
        // readLine不读取换行,每读到换行就认为这一行结束了。
        // 所以在下面使用System.out.println而不是System.out.print来输出data
        String data;
        while ((data=bf1.readLine())!=null){
            System.out.println(data);
            //System.out.print(data+"\n"); 当然,也可以这么写。
        }
        bf1.close();


    }

}


运行结果(为txt文件内的内容):

Utilitatis causa amicitia est quaesita.

 /*
    *
    * 使用BufferedReader将sample1.txt中的内容复制在控制台上。
    *
    * */
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Collatio igitur ista te nihil iuvat. Honesta oratio, Socratica, Platonis etiam. Primum in nostrane potestate est, quid meminerimus? Duo Reges: constructio interrete. Quid, si etiam iucunda memoria est praeteritorum malorum? Si quidem, inquit, tollerem, sed relinquo. An nisi populari fama?

Quamquam id quidem licebit iis existimare, qui legerint. Summum a vobis bonum voluptas dicitur. At hoc in eo M. Refert tamen, quo modo. Quid sequatur, quid repugnet, vident. Iam id ipsum absurdum, maximum malum neglegi.

Process finished with exit code 0

BufferedWriter(向文件写入文字类数据使用)

举例:使用BufferedReader将sample1.txt中的内容复制给一个新的文件。

package IOTest;

import org.junit.Test;

import java.io.*;

public class BufferedReaderWriterTest {
    /*
    *
    * 使用BufferedReader将sample1.txt中的内容建立并且复制给一个新文件。
    *
    * */


    public static void main(String[] args) throws IOException {

  //如果想省事儿也可以写成一行 BufferedReader bf1 = new BufferedReader(new FileReader(new File("sample1.txt")));

        File f1 = new File("sample1.txt");
        File fout = new File("mycopy_sample1.txt");
        //FileReader fr1 = new FileReader(f1);
        //BufferedReader bf1 = new BufferedReader(fr1);
        BufferedReader bf1 = new BufferedReader(new FileReader(f1));
        BufferedWriter bfout = new BufferedWriter(new FileWriter(fout));
        char [] cart = new char[10];
        int len = 0;
 /* 读取方式也可使用:
        *
        while((len = bf1.read(cart))!= -1){
            String st1 = new String(cart,0,len);
            System.out.print(st1);
        }
*/
      /readLine/方式:使用readLine,每次读取一行,不带回车。注意readLine方法返回值为null说明全部读完了。
        // readLine不读取换行,每读到换行就认为这一行结束了。
        // 所以在下面使用System.out.println而不是System.out.print来输出data

        String data;
        while ((data=bf1.readLine())!=null){
            //因为readLine最后不会读取换行符,所以缺失了"\n"用户可以自己补上
            // bfout.write(data+"\n"); 这种写法的功能等于下面两行
            bfout.write(data);
            bfout.newLine();

            bfout.flush();//这句话的意思就是输出的文件会实时更新内容
            // 如果这句不写,最后有close关闭资源也行;
            // 但是如果flush close两个都没写,那最后的文件是看不到内容的
            // 那是因为系统内存的data并没有及时更新到txt文件去

   }
        System.out.println("复制成功");
        bf1.close();
        bfout.close();


    }

}


输出:

复制成功

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值