【Java nio】Channel
package com.slp.nio; import org.junit.Test; import java.io.*;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Map;
import java.util.Set; /**
* Created by sanglp on 2017/3/1.
* 一、通道:用于源节点与目标节点的连接,在Java NIO中负责缓冲区中数据的传输。通道本身是不存储任何数据的,因此需要配合缓冲区进行传输数据
* 二、通道的一些主要实现类
* java.nio.Channel接口
* |--FileChannel
* |--SocketChannel
* |--ServerSocketChannel
* |--DatagramChannel
* 三、获取通道
* 1.java针对支持通道的类提供了getChannel()方法
* 本地IO:
* FileInputStream/FileOutputStream/RandomAccessFile
* 网络IO:
* Socket
* ServerSocket
* DategramSocket
* 2.在jdk1.7中的NIO2针对各个通道提供了一个静态方法open()
* 3。jdk1.7中的NIO2的Files工具类的newByteChannel()
* 四、通道之间的数据传输
* transferFrom()
* transferTo()
* 五、分散和聚集
* 分散度区:将通道中的数据分散到多个缓冲区中
* 聚集写入:将多个缓冲区中的数据聚集到通道中
*
* 六、字符集:Charset
* 编码:字符串->字节数组
* 解码:字节数组->字符串
*/
public class TestChannel {
@Test
public void test6() throws CharacterCodingException {
Charset cs1 = Charset.forName("GBK");
//获取编码器和解码器
CharsetEncoder ce = cs1.newEncoder();
//获取解码器
CharsetDecoder cd = cs1.newDecoder(); CharBuffer charBuffer = CharBuffer.allocate(1024);
charBuffer.put("桑丽平加油!!");
charBuffer.flip(); //编码
ByteBuffer byteBuffer = ce.encode(charBuffer);
for (int i=0;i<12;i++){
System.out.println(byteBuffer.get(i));
} //解码
byteBuffer.flip();
CharBuffer charBuffer1 = cd.decode(byteBuffer);
System.out.println(charBuffer1.toString()); System.out.println("------------------------"); Charset cs2 = Charset.forName("UTF-8");
byteBuffer.flip();
CharBuffer cBuf3 =cs2.decode(byteBuffer);
System.out.println(cBuf3.toString());
} @Test
public void test5(){
Map<String,Charset> map=Charset.availableCharsets();
Set<Map.Entry<String,Charset>> set = map.entrySet();
for (Map.Entry<String,Charset> entry :set ){
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
@Test
public void test4() throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile("1.txt","rw");
//获取通道
FileChannel channel = randomAccessFile.getChannel();
//分配指定大小的缓冲区
ByteBuffer buffer1 = ByteBuffer.allocate(100);
ByteBuffer buffer2 = ByteBuffer.allocate(1024);
//分散读取
ByteBuffer [] bufs = {buffer1,buffer2};
channel.read(bufs);
for (ByteBuffer byteBuffer:bufs){
byteBuffer.flip();
} System.out.println(new String(bufs[0].array(),0,bufs[0].limit()));
System.out.println("---------------");
System.out.println(new String(bufs[1].array(),0,bufs[1].limit())); //聚集写入
RandomAccessFile randomAccessFile1 = new RandomAccessFile("2.txt","rw");
FileChannel channel1 = randomAccessFile1.getChannel();
channel1.write(bufs); } //通道之间的数据传输(直接缓冲区)
@Test
public void test3() throws IOException {
FileChannel fileChannel = FileChannel.open(Paths.get("pipe.bmp"), StandardOpenOption.READ);
FileChannel outChannel =FileChannel.open(Paths.get("4.bmp"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE_NEW); fileChannel.transferTo(0,fileChannel.size(),outChannel);
//outChannel.transferFrom(fileChannel,0,fileChannel.size());或者
fileChannel.close();
outChannel.close();
} //2、利用直接缓冲区完成文件的复制(内存映射文件)
@Test
public void test2() throws IOException {
FileChannel fileChannel = FileChannel.open(Paths.get("pipe.bmp"), StandardOpenOption.READ);
FileChannel outChannel =FileChannel.open(Paths.get("3.bmp"),StandardOpenOption.WRITE,StandardOpenOption.READ,StandardOpenOption.CREATE_NEW);
//内存映射文件
MappedByteBuffer imMappedBuf = fileChannel.map(FileChannel.MapMode.READ_ONLY,0,fileChannel.size());
MappedByteBuffer outMappedBuf = outChannel.map(FileChannel.MapMode.READ_WRITE,0,fileChannel.size());
//直接对缓冲区进行数据的读写操作
byte [] dst = new byte[imMappedBuf.limit()];
imMappedBuf.get(dst);
outMappedBuf.put(dst); fileChannel.close();
outChannel.close(); } //1、利用通道完成文件的复制(费直接缓冲区)
@org.junit.Test
public void test1(){
FileInputStream fis =null;
FileOutputStream fos =null;
FileChannel inChanne=null;
FileChannel outChannel=null;
try{
fis = new FileInputStream("pipe.bmp");
fos = new FileOutputStream("2.jpg");
//获取通道
inChanne =fis.getChannel();
outChannel = fos.getChannel();
//分配指定大小的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//将通道中的数据存入缓冲区中
while (inChanne.read(buffer)!=-1) {
buffer.flip();//切换为读取数据的模式
//将缓冲区中的数据写入通道
outChannel.write(buffer);
buffer.clear();//清空缓冲区
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(outChannel!=null){
try {
outChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inChanne!=null){
try {
inChanne.close();
} catch (IOException e) {
e.printStackTrace();
}
} if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }
}
【Java nio】Channel的更多相关文章
- 【Java nio】 NonBlocking NIO
package com.slp.nio; import org.junit.Test; import java.io.IOException; import java.net.InetSocketAd ...
- 【Java nio】 Blocking nio
package com.slp.nio; import org.junit.Test; import java.io.File; import java.io.IOException; import ...
- 【Java nio】java nio笔记
缓冲区操作:缓冲区,以及缓冲区如何工作,是所有I/O的基础.所谓“输入/输出”讲的无非就是把数据移出货移进缓冲区.进程执行I/O操作,归纳起来也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要 ...
- 【Java NIO】一文了解NIO
Java NIO 1 背景介绍 在上一篇文章中我们介绍了Java基本IO,也就是阻塞式IO(BIO),在JDK1.4版本后推出了新的IO系统(NIO),也可以理解为非阻塞IO(Non-Blocking ...
- 【JAVA NIO】java NIO
本文是博主深入学习Netty前的一些铺垫,之前只是使用Netty,用的很粗暴,导包,上网找个DEMO就直接用,对Netty中的组件了解并不深入. 于是再此总结下基础,并对一些核心组件作如下记录: 1. ...
- 【Java nio】Blocking nio2
package com.slp.nio; import org.junit.Test; import java.io.File; import java.io.IOException; import ...
- 【Java nio】buffer
package com.slp.nio; import org.junit.Test; import java.nio.ByteBuffer; /** * Created by sanglp on 2 ...
- 【java NIO】服务器端读写图片的一次排错经历
上传文件方面: 一.前端 使用的是jQuery框架来上传图片,参考的是harttle大神博客:http://harttle.com/2016/07/04/jquery-file-upload.html ...
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
随机推荐
- Spring事件监听Demo
Spring事件监听实现了观察者模式.本Demo在junit4测试环境中实现 主要有三个类事件类.监听器类.事件发布类(入口) 事件类必须继承 ApplicationEvent,代码如下: impor ...
- STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
Ⅰ.概述 本文讲述关于STM32功能比较强大的ADC模块.ADC(Analog to Digital Converter)也就是模拟量转化为数字量,而STM32的ADC模块功能比较多,本文主要讲述“三 ...
- 【C】——压缩字符串
编一个函数,输入一个字符串,要求做一个新字符串,把其中所有的一个或多个连续的空白字符都压缩为一个空格.这里所说的空白包括空格.'\t'.'\n'.'\r'.例如原来的字符串是: This Conten ...
- d3js网络拓扑关系特效可视化展现
d3js拓扑关系特效可视化展现 在上一篇d3js文档http://www.cnblogs.com/juandx/p/3959900.html中讲了简单的d3js方法和效果,现在我做一个完整的演示,使用 ...
- eclipse新建python项Project interpreter not specified
安装好pydev后新建python项目时提示”Project interpreter not specified“的错误,这是因为没有导入python开发环境所致 解决方法如下:1.找到eclipse ...
- Workerman
What is it Workerman is a library for event-driven programming in PHP. It has a huge number of featu ...
- spring配置事务 元素 "tx:annotation-driven" 的前缀 "tx" 未绑定
在进行spring与mybatis整合时,启动项目报错,控制台提示“元素 "tx:annotation-driven" 的前缀 "tx" 未绑定”. 经过查找, ...
- 【学习笔记】jQuery中的动画与效果
1.基本效果 匹配元素从左上角开始变浓变大或缩小到左上角变淡变小 ①隐藏元素 除了可以设置匹配元素的display:none外,可以用以下函数 hide(speed,[callback]) 返回值: ...
- 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...
- 天线增益英文名称:antenna gain
天线增益是指:在输入功率相等的条件下,实际天线与理想的辐射单元在空间同一点处所产生的信号的功率密度之比.它定量地描述一个天线把输入功率集中辐射的程度.增益显然与天线方向图有密切的关系,方向图主瓣越窄, ...