zoukankan      html  css  js  c++  java
  • 利用通道完成文件的复制 (非直接缓存区)

    package com.nio;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    
    /**
     * 一、通道:用于源节点与目标节点的连接。在java nio中负责缓存区中数据的传输。channel本身不存储数据,因此需要配合缓存区进行传输。
     * 二、通道的主要实现类
     *    java.nio.channels.Channel 接口:
     *          FileChannel
     *          SocketChannel
     *          ServerSocketChannel
     *          DatagramChannel
     * 三、获取通道的几种方式
     * 1.java针对支持通道的类提供了getChannel()方法
     *    本地io:
     *       FileInputStream/FileOutputStream
     *       RandomAccessFile
     *    网络IO:
     *       Socket
     *       ServerSocket
     *       DatagramSocket
     *  2.在jdk 1.7中的nio.2针对各个通道提供了静态方法open()
     *  3.在jdk1.7中的nio.2的Files工具类的newByteChannel()
     */
    public class TestChannel {
        public static void main(String[] args) throws IOException {
            //利用通道完成文件的复制  (非直接缓存区)
            FileInputStream fis = new FileInputStream("001.jpg");//这种相对路径的方式获取的是项目根目录下的图片的信息
            FileOutputStream fos = new FileOutputStream("003.jpg");//复制出来的图片也是在项目的根目录下面
            //1.获取通道
            FileChannel inChannel = fis.getChannel();
            FileChannel outChannel = fos.getChannel();
            //2.分配指定大小的缓存区
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            //3.将通道中的数据不存入到缓存区中
            while (inChannel.read(buffer)!=-1){
                buffer.flip();//切换读数据的模式
                //4.将缓存区中的数据写入到通道中
                outChannel.write(buffer);
                buffer.clear();//清空缓存区
    
            }
            //5.关闭通道和对应的流
            outChannel.close();
            inChannel.close();
            fos.close();
            fis.close();
    
    
        }
    
    }
    

      

    以上两种复制文件的对比,通过我们对大文件复制的测试,第二种方式明显会比第一种方式要快一点。也就是说,基于物理内存的方式要比非直接缓存区的方式要快一点。但是基于物理内存的方式效率虽然比较高,但是就是有一点不太稳定。

  • 相关阅读:
    开源的Ajax.Net类库
    开放的即时通信协议Jabber
    代码生成工具之MyGeneration
    清华梦的粉碎—写给清华大学的退学申请(牛人 王垠 )
    [.NET网格计算框架] Alchemi
    .net安全类库
    使用Facility:EnterpriseLibrary整合进Castle
    castle project 发布新版本
    10招步骤保护IIS服务器安全
    应用IBatisNet+Castle进行项目的开发
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/14414199.html
Copyright © 2011-2022 走看看