Java flush()作用及适用场景 FileOutputStream BufferedOutputStream区别 缓冲区与字节数组的理解

flush()作用及适用场景

flush() : 刷新缓冲区,流对象可以继续使用。
close(): 先刷新缓冲区,然后通知系统关闭资源,流对象不可以再被使用。
 
flush()使用场景:
字符输出流:
1.创建Filewriter对象,构造方法中绑定要写入数据的地址
2.使用Filewriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
3.使用Filewriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
 
使用缓冲的字节输出流:
1.创建FileOutputstream对象,构造方法中绑定要输出的地址
2.创建BufferedOutputStream对象,构造方法中传递FileOutputstream对象对象,提高FileOutputStream对象效率
3.使用Bufferedoutputstream对象中的方法write ,把数据写入到内部缓冲区中
4.使用Bufferedoutputstream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
5.释放资源(会先把内存缓冲区中的数据刷新到文件中)
 
使用缓冲的字符输出流:
1.创建BufferedWriter对象,构造方法中传递字符输出流
2.调用BufferedWriter中的方法write,把数据写入到内存缓冲区中
3.调用BufferedWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4.释放资源(会先把内存缓冲区中的数据刷新到文件中)

以上场景,在close()之前,若不使用flush()方法,内容将无法写入硬盘文件中(保存在内存中,文件中不出现数据)。
 
不需使用flush()的场景:
字节输出流:
1.创建一个FileOutputStream对象,构造方法中传递写入数据的地址
2.调用FileOutputStream对象中的方法write ,把数据写入到文件中
3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)

该场景,在close()之前,若不使用flush()方法,内容可以写入硬盘文件中(文件中出现数据)。
 

FileOutputStream BufferedOutputStream区别 缓冲区与字节数组的理解

先放一个对比试验,4种不同方式的字节读写方式实现复制图片:

1.利用字节流FileInputStream加每次单个字节复制文件 :共耗时4552毫秒

//利用字节流FileInputStream加单个字节复制文件 

import java.io.*;

public class CopyCSDN2 {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        File file = new File("C:\\Users\\lsb\\Desktop\\picture.png");
        File file1 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
        try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(file1)) {
            int len;
            while ((len = inputStream.read()) != -1) {//返回收到的实际读取的字节数len
                outputStream.write(len);
            }
        } catch (IOException e) {
            System.out.println(e);
        }
        long end = System.currentTimeMillis();
        System.out.println("finish,耗时:" + (end - start) + "毫秒");
    }
}

 2.利用字节流FileInputStream加字节数组复制文件 :共耗时7毫秒

//利用字节流FileInputStream加字节数组复制文件  

import java.io.*;

public class CopyCSDN {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        File file = new File("C:\\Users\\lsb\\Desktop\\picture.png");
        File file1 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
        byte[] buffer = new byte[1024];// 创建1024B的字节数组
        try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(file1)) {
            int len;
            while ((len = inputStream.read(buffer)) != -1) {//返回收到的实际读取的字节数len
                outputStream.write(buffer, 0, len);//buffer中从0开始的len个字节,排除原buffer中的数的影响
            }
        } catch (IOException e) {
            System.out.println(e);
        }
        long end = System.currentTimeMillis();
        System.out.println("finish,耗时:" + (end - start) + "毫秒");
    }
}
3.使用BufferedOutputStream 加单个字节复制文件:共耗时24毫秒
//使用Bufferedoutputstream 加单个字节复制文件

import java.io.*;

public class CopyCSDN4 {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        File file1 = new File("C:\\Users\\lsb\\Desktop\\picture.png");
        File file2 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
        try (BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file1));
             BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file2));) {
            int len;
            while ((len = bi.read()) != -1) {
                bo.write(len);
            }
        } catch (IOException e) {
            System.out.println(e);
        }
        long end = System.currentTimeMillis();
        System.out.println("finish,耗时:" + (end - start) + "毫秒");
    }
}

4.使用BufferedOutputStream 加字节数组复制文件,共耗时:3毫秒

//使用Bufferedoutputstream 加字节数组复制文件

import java.io.*;

public class CopyCSDN3 {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        File file1 = new File("C:\\Users\\lsb\\Desktop\\picture.png");
        File file2 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
        try (BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file1));
             BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file2));) {
            byte[] bytes = new byte[1024];//创建1024B字节数组
            int len;
            while ((len = bi.read(bytes)) != -1) {
                bo.write(bytes, 0, len);
            }
        } catch (IOException e) {
            System.out.println(e);
        }
        long end = System.currentTimeMillis();
        System.out.println("finish,耗时:" + (end - start) + "毫秒");


    }
}

实验结果表明:使用BufferedOutputStream 加字节数组复制文件更加高效,性能最差的是FileOutputStream加单个字节复制,耗时最长。其实设置字节数组和使用BufferedOutputStream均是利用较大的字节数组对需要读取或写入的数据进行缓存,同时使用两者相当于使用双重缓存,更加高效。

 

 
 
  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java使用字节缓冲区流(BufferedInputStream、BufferedOutputStream)复制文件,并输出复制所消耗的时间的示例代码: ```java import java.io.*; public class FileCopy { public static void main(String[] args) { // 定义源文件和目标文件 File sourceFile = new File("source.txt"); File targetFile = new File("target.txt"); // 定义字节缓冲区输入流和输出流 BufferedInputStream bis = null; BufferedOutputStream bos = null; try { // 初始化字节缓冲区输入流和输出流 bis = new BufferedInputStream(new FileInputStream(sourceFile)); bos = new BufferedOutputStream(new FileOutputStream(targetFile)); // 定义读取字节缓冲区 byte[] buffer = new byte[1024]; // 定义记录读取字节总数的变量 int bytesRead = 0; // 定义记录开始时间的变量 long startTime = System.currentTimeMillis(); // 循环读取字节,并将读取的字节写入目标文件 while ((bytesRead = bis.read(buffer)) != -1) { bos.write(buffer, 0, bytesRead); } // 刷新输出流,确保所有缓冲的字节都被写入目标文件 bos.flush(); // 计算复制文件所消耗的时间 long elapsedTime = System.currentTimeMillis() - startTime; // 输出复制所消耗的时间 System.out.println("复制文件所消耗的时间: " + elapsedTime + " 毫秒"); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭字节缓冲区输入流和输出流 try { if (bis != null) { bis.close(); } if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } } } ``` 注意:在运行示例代码之前,需要将源文件 "source.txt" 放在与该代码相同的目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值