通道Channel获取四种方法

package com.hp.buffer;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

import org.junit.Test;

public class TextChannel {

	@Test //获得通道方法一:用getChannel()方法(非直接缓冲区)
	public void text1() throws IOException {

		FileInputStream fis = null;
		FileOutputStream fos = null;
		FileChannel inChannel = null;
		FileChannel outChannel = null;
		long start = System.currentTimeMillis();
		try {
			//输入输出流
			fis = new FileInputStream("D:\\6.jpg");
			fos = new FileOutputStream("D:\\8.jpg");
			//通道
			inChannel = fis.getChannel();
			outChannel = fos.getChannel();
			//缓冲区
			ByteBuffer buffer = ByteBuffer.allocate(1024);

			//把通道里面的数据,读出来,放缓冲区里面
			while(inChannel.read(buffer)!= -1) {
				//把缓冲区里面的数据,写入,到通道里面
				buffer.flip();
				outChannel.write(buffer);
				buffer.clear();//清空缓存区
			}

		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			//对通道和流进行关闭
			  if(outChannel!=null) {
				  outChannel.close();
			  }
			  if(inChannel!=null) {
				  outChannel.close();
			  }
			  if(fos!=null) {
				  fos.close();
			  }
			  if(fis!=null) {
				  fis.close();
			  }
		}
		long end = System.currentTimeMillis();
		System.out.println(end-start);
	}	

	//获得通道方法二:静态open()方法,获取FileChannel对象,
	//(直接缓冲区:不用写在应用程序的内存里面,直接写在物理地址上面)
	@Test
	public void test2() throws Exception {

		FileChannel	 inChannel = FileChannel.open(Paths.get("D:\\6.jpg"), StandardOpenOption.READ);

		MappedByteBuffer inmap = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());

		FileChannel	 outChannel = FileChannel.open(Paths.get("D:\\9.jpg"), StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE_NEW);

		MappedByteBuffer outmap = outChannel.map(MapMode.READ_WRITE , 0, inChannel.size());

		long start = System.currentTimeMillis();
		//对缓冲区域的数据进行操作
		byte[] dst = new byte[inmap.limit()];
		inmap.get(dst);
		outmap.put(dst);

		outChannel.close();
		inChannel.close();

		long end = System.currentTimeMillis();
		System.out.println(end-start);
	}

	//transferTo() /transferForm()  (直接缓冲区)
	@Test
	public void test3() throws Exception {

		FileChannel inFile = FileChannel.open(Paths.get("D:\\6.jpg"), StandardOpenOption.READ);

		FileChannel outFile = FileChannel.open(Paths.get("D:\\10.jpg"), StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE);

		inFile.transferTo(0, inFile.size(), outFile);

		outFile.close();
		inFile.close();
	}

	  @Test //从流中获取通道,采用allocateDirect方式(直接缓冲区)
	public void test4() throws Exception {

	  FileChannel inFile = FileChannel.open(Paths.get("D:\\6.jpg"),
	  StandardOpenOption.READ);

	  FileChannel outFile = FileChannel.open(Paths.get("D:\\11.jpg"),
	  StandardOpenOption.READ,StandardOpenOption.WRITE,StandardOpenOption.CREATE);

	  ByteBuffer buffer = ByteBuffer.allocateDirect((int)inFile.size());

	  inFile.read(buffer);
	  buffer.flip();  //切换
	  outFile.write(buffer);

	  outFile.close();
	  inFile.close();
	}

}

  

原文地址:https://www.cnblogs.com/zxrxzw/p/10933021.html

时间: 2024-10-16 05:11:17

通道Channel获取四种方法的相关文章

【Java必修课】通过Value获取Map中的键值Key的四种方法

1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value值,求Key值. 本文将用实例介绍四种方法,通过传入Value值,获取得到Key值. 2 四种方法 2.1 循环法 循环法就是通过遍历Map里的Entry,一个个比较,把符合条件的找出来.会有三种情况: (1)找到一个值 (2)找到多个值 (3)找不到 具体代码如下: @Test public void lo

四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)

原文:四种方法获取可执行程序的文件路径(.NET Core / .NET Framework) 本文介绍四种不同的获取可执行程序文件路径的方法.适用于 .NET Core 以及 .NET Framework. 本文内容 使用程序集信息获取 使用应用程序域信息获取 使用进程信息获取 使用命令行参数获取 总结靠谱的方法 另外,关于以上方法的性能对比,你可以参阅林德熙的博客:[dotnet 获取路径各种方法的性能对比](https://blog.lindexi.com/post/dotnet-%E8%

android 定位一般有四种方法

android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,                             (1)Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了).通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电:2,绝大部分用户默认不开启GPS模块:3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间:4,室内几乎无法使用.

IOS中Json解析的四种方法

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json. 本文将介绍TouchJso

JAVA实现单例模式的四种方法和一些特点

JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下 一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Singleton(){ } private static Singleton instance = new Singleton(); private static Singleton getInstance(){          return instance;      }  } 特点:饿汉式提前实例化,没有

IOS开发之——四种方法解析Jason数据(转)

本文将介绍TouchJson. SBJson .JSONKit 和 iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库 TouchJson包下载: http://download.csdn.net/detail/enuola/4523169 SBJson 包下载: http://download.csdn.net/detail/enuola/4523177 JSONKit包下载:http://download.csdn.net/detail

Spring Security3的四种方法概述

使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过,并经过验证: 二种是用户和权限用数据库存储,而资源(url)和权限的对应采用硬编码配置,目前这种方式已经实现,并经过验证. 三种是细分角色和权限,并将用户.角色.权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器,     并分别实现Ac

20150503 imx257下实现I2C驱动的四种方法

20150503 imx257下实现I2C驱动的四种方法 2015-05-3 Lover雪儿 时间过得好快,转眼间五一假期就即将结束了,假期期间,大家都潇洒的去玩了,徒留辛辛苦苦的程序员还是窝在宿舍乖乖的敲着代码... 好啦,开开玩笑,辛酸史每家都有一大本,还是要积极的面对生活!!! 今天我们的任务是简单的入门linux内核下i2c设备驱动分离的四种写法. 一.一个简单的i2c驱动 和以前的驱动程序不同,i2c驱动分为drv驱动和dev设备驱动两个文件,不懂的可以参考我以前写的<20150313

详解Java解析XML的四种方法

(1)DOM解析 DOM是html和xml的应用程序接口(API),以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取 和操作文档的任意部分,是W3C的官方标准 [优点] ①允许应用程序对数据和结构做出更改. ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据. [缺点] ①通常需要加载整个XML文档来构造层次结构,消耗资源大. [解析详解] ①构建Document对象: DocumentBuilderFactory dbf = DocumentBu