文档章节

nio/io 拷贝文件

暗中观察
 暗中观察
发布于 06/12 18:32
字数 426
阅读 9
收藏 0

nio的拷贝文件大概能比io拷贝文件快1倍左右,为何会快1倍了,查看了它的源码,发现它用到了直接内存,即与jvm内存相比,省去了一次拷贝。所以能加快速度,但它也是一把双刃剑,有如下缺点,可以不借用cpu,是独立的处理器,专门用于处理io

①,申请内存空间比较慢

②,直接内存不属于jvm管理范围内,释放比较难,可能会造成oom问题,出现问题比较难排查

import java.io.*;
import java.nio.channels.FileChannel;

/**
 * @author hui
 * @date 2019/6/12
 */
public class IOUtil {

    public static void fileCopyWithFileChannel( FileInputStream fileInputStream,FileOutputStream fileOutputStream) {
        FileChannel fileChannelInput = null;
        FileChannel fileChannelOutput = null;
        try {
            // 得到fileInputStream的文件通道
            fileChannelInput = fileInputStream.getChannel();
            // 得到fileOutputStream的文件通道
            fileChannelOutput = fileOutputStream.getChannel();
            // 将fileChannelInput通道的数据,写入到fileChannelOutput通道
            fileChannelInput.transferTo(0, fileChannelInput.size(), fileChannelOutput);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 用filechannel进行文件复制
     *
     * @param fromFile
     *            源文件
     * @param toFile
     *            目标文件
     */
    public static void fileCopyWithFileChannel(File fromFile, File toFile) {
        FileInputStream fileInputStream = null;
        FileOutputStream fileOutputStream = null;
        try {
            fileInputStream=new FileInputStream(fromFile);
            fileOutputStream=new FileOutputStream(toFile);
            fileCopyWithFileChannel(fileInputStream, fileOutputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            IOUtil.close(fileOutputStream);
            IOUtil.close(fileInputStream);
        }

    }

  public static long copy(final InputStream input, final OutputStream output)
            throws IOException {
        byte[] buffer = new byte[1024];
        long count = 0;
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
            count += n;
        }
        return count;
    }

    public static void close(Closeable closeable){
        if(closeable != null){
            try {
                closeable.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
        }
    }

}

普通的流的拷贝

 

参考:https://blog.csdn.net/stalin_/article/details/80352132

© 著作权归作者所有

暗中观察

暗中观察

粉丝 7
博文 128
码字总数 45846
作品 0
惠州
私信 提问
NIO拷贝文件真的比IO拷贝文件效率高?

本文是基于单线程的NIO和IO拷贝文件比较, 并未对并发做测试, 请勿过度纠结场景! 今天发现项目中有个FileUtils.copy的工具方法, 打开后发现是基于io的, 我给改成了基于NIO的, 突然疑虑N...

xiaoqqq
2014/06/10
8.1K
45
javaIO相关问题,关于IO与NIO时间对比异常

第一次: 传统IO方法实现文件拷贝耗时:1122ms 利用NIO文件通道方法实现文件拷贝耗时:74ms 利用NIO文件内存映射及文件通道实现文件拷贝耗时:2031ms 第二次: 传统IO方法实现文件拷贝耗时:1079...

黄贤达
03/06
54
0
java中io与nio复制文件性能对比

在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区。参看read(byte b[])方法的源码...

hello菜bird
2016/10/23
1K
1
学习Java基础知识,打通面试关十一~文件的拷贝

上一篇文章我们说了IO流操作,里面区分了BIO,NIO,AIO,这些方式提高了我们在文件的操作,那么我们使用文件拷贝的时候,IO里面又提供了什么内容呢? 在JDK1.7以前是没有文件的拷贝的方式的。 ...

super糖
2018/06/09
0
0
Java异步NIO框架Netty实现高性能高并发

背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于J...

java知识分子
2018/09/28
43
0

没有更多内容

加载失败,请刷新页面

加载更多

作为一个(IT)程序员!聊天没有话题?试试这十二种技巧

首先呢?我是一名程序员,经常性和同事没话题。 因为每天都会有自己的任务要做,程序员对于其他行业来说;是相对来说比较忙的。你会经常看到程序员在发呆、调试密密麻麻代码、红色报错发呆;...

小英子wep
59分钟前
12
0
【SpringBoot】产生背景及简介

一、SpringBoot介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程,该框架使用了特定的方式来进行配置,从而使开发人员不再需要...

zw965
今天
4
0
简述并发编程分为三个核心问题:分工、同步、互斥。

总的来说,并发编程可以总结为三个核心问题:分工、同步、互斥。 所谓分工指的是如何高效地拆解任务并分配给线程,而同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共...

dust8080
今天
6
0
OSChina 周四乱弹 —— 当你简历注水但还是找到了工作

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享成龙的单曲《男儿当自强》。 《男儿当自强》- 成龙 手机党少年们想听歌,请使劲儿戳(这里) @hxg2016 :刚在...

小小编辑
今天
3.2K
22
靠写代码赚钱的一些门路

作者 @mezod 译者 @josephchang10 如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。 今天给大家分享一个精彩的 GitHub 库,这个库整理...

高级农民工
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部