不同的方式文件写入性能对比

代码示例展示了不同文件复制方法的性能差异,包括单字节操作、1000字节缓冲区、Buffered流、8KB缓冲数组以及使用DMA(直接内存访问)的FileChannel操作。测试结果显示,FileChannel的DMA方式在文件复制中表现出最高的效率。
摘要由CSDN通过智能技术生成
​
package com.test;

import org.junit.Test;

import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class mytest {
    String TEST_PATH = "e:\\myfile\\";

    //1、单字节复制文件
    @Test
    public void perByteOperation() {
        System.out.println("开始单字节单字节复制文件...");
        long start = System.currentTimeMillis();
        try (FileInputStream fis = new FileInputStream(TEST_PATH + "dockerfile.vep");
             FileOutputStream fos = new FileOutputStream(TEST_PATH + "ts1.vep")) {
            int i;
            while ((i = fis.read()) != -1) {
                fos.write(i);
            }
        } catch (Exception e) {

            System.out.println("单字节单字节复制文件异常" + e);
        }
        Long time = System.currentTimeMillis() - start;
        System.out.println("结束单字节单字节复制文件...,耗时:" + time + "ms");
//          开始单字节单字节复制文件...
//          结束单字节单字节复制文件...,耗时:136896ms
    }

    //2、1000字节缓冲区复制文件
/*    @Test
    public void bufferOperationWith1000() {
        System.out.println("开始带1000字节缓冲区复制文件...");
        long start = System.currentTimeMillis();
        try (FileInputStream fis = new FileInputStream(TEST_PATH + "dockerfile.vep");
             FileOutputStream fos = new FileOutputStream(TEST_PATH + "ts2.vep")) {
            byte[] buf = new byte[1000];
            int len;
            while ((len = fis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
        } catch (Exception e) {
            System.out.println("带1000字节缓冲区复制文件"+ e);

        }

        Long time = System.currentTimeMillis() - start;
        System.out.println("结束带1000字节缓冲区复制文件...,耗时:"+ time +"ms");
//      开始带1000字节缓冲区复制文件...
//      结束带1000字节缓冲区复制文件...,耗时:261ms
    }*/

    //3、Buffered缓冲区复制文件
/*    @Test
    public void bufferStreamByteOperation() {
        System.out.println("开始带缓冲区复制文件...");
        long start = System.currentTimeMillis();
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(TEST_PATH + "dockerfile.vep"));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(TEST_PATH + "ts3.txt"))) {
            int i;
            while ((i = bis.read()) != -1) {
                bos.write(i);
            }
        } catch (Exception e) {
            System.out.println("带缓冲区复制文件文件异常" + e);
        }
        Long time = System.currentTimeMillis() - start;
        System.out.println("结束带缓冲区复制文件...,耗时:"+ time +"ms");
//        开始带缓冲区复制文件...
//        结束带缓冲区复制文件...,耗时:451ms
    }*/

    //4、在BufferedStream基础上,写入的时候新增一个8KB的缓冲
/*    @Test
    public void bufferStreamBufferOperation() {
        System.out.println("bufferStreamBufferOperation开始带缓冲区复制文件...");
        long start = System.currentTimeMillis();
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(TEST_PATH + "dockerfile.vep"));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(TEST_PATH + "ts4.vep"))) {
            byte[] buf = new byte[8196];
            int i;
            while ((i = bis.read(buf)) != -1) {
                bos.write(buf, 0, i);
            }
        } catch (Exception e) {
            System.out.println("带缓冲区复制文件文件异常" + e);
        }
        Long time = System.currentTimeMillis() - start;
        System.out.println("结束bufferStream带8KB缓冲区复制文件...,耗时:"+ time +"ms");
//        bufferStreamBufferOperation开始带缓冲区复制文件...
//        结束bufferStream带8KB缓冲区复制文件...,耗时:94ms
    }*/

    //5、不采用缓冲流,只新增8KB的缓冲数组

/*    @Test
    public void streamBufferOperation() {
        System.out.println("streamBufferOperation开始只新增8KB的缓冲数组复制文件...");
        long start = System.currentTimeMillis();
        try (FileInputStream fis = new FileInputStream(TEST_PATH + "dockerfile.vep");
             FileOutputStream fos = new FileOutputStream(TEST_PATH + "ts5.vep")) {
            byte[] buf = new byte[8196];
            int i;
            while ((i = fis.read(buf)) != -1) {
                fos.write(buf, 0, i);
            }
        } catch (Exception e) {
            System.out.println("带缓冲区复制文件文件异常"+ e);
        }
        Long time = System.currentTimeMillis() - start;
        System.out.println("结束只新增8KB的缓冲数组复制文件...,耗时:"+ time +"ms");
//        streamBufferOperation开始只新增8KB的缓冲数组复制文件...
//        结束只新增8KB的缓冲数组复制文件...,耗时:109ms
    }*/

// 6、DMA(直接内存访问),数据从磁盘经过总线直接发送到目标文件,无需经过内存和 CPU 进行数据中转,这种方式更快。

/*    @Test
    public void fileChannelOperation() throws IOException {
        System.out.println("fileChannelOperation开始复制文件...");
        long start = System.currentTimeMillis();
        FileChannel in = FileChannel.open(Paths.get(TEST_PATH + "dockerfile.vep"), StandardOpenOption.READ);
        FileChannel out = FileChannel.open(Paths.get(TEST_PATH + "ts6.vep"), StandardOpenOption.CREATE,
                StandardOpenOption.WRITE);
        in.transferTo(0, in.size(), out);
        Long time = System.currentTimeMillis() - start;
        System.out.println("结束fileChannelOperation复制文件...,耗时:"+ time +"ms");
//      fileChannelOperation开始复制文件...
//      结束fileChannelOperation复制文件...,耗时:42ms
    }*/


}

​

void write(int b) 将指定的字节写入此文件输出流 一次写一个字节数据
void write(byte[] b)将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据
void write(byte[] b, int off, int len)将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流一次写一个字节数组的部分数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值