为什么80%的码农都做不了架构师?>>>   

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。

  • 通道可以异步地读写。

  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道。如下图所示:

Channel的实现

这些是Java NIO中最重要的通道的实现:

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。

SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

基本的 Channel 示例

下面是一个使用FileChannel读取数据到Buffer中的示例:

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class T {
 public static void main(String[] args) throws IOException {
  RandomAccessFile aFile = new RandomAccessFile("test.dat", "rw");
  FileChannel inChannel = aFile.getChannel();

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = inChannel.read(buf);
  while (bytesRead != -1) {

System.out.println("Read " + bytesRead);
   buf.flip();

while (buf.hasRemaining()) {
    System.out.print((char) buf.get());
   }

buf.clear();
   bytesRead = inChannel.read(buf);
  }
  aFile.close();

}
}

注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据。下一节会深入讲解Buffer的更多细节。

转载于:https://my.oschina.net/kepler/blog/202237

Java NIO系列教程(二) Channel相关推荐

  1. 转:Java NIO系列教程(二) Channel

    Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Bu ...

  2. Java NIO系列教程(十二) Java NIO与IO

    原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java ...

  3. Java NIO系列教程(三) Buffer

    2019独角兽企业重金招聘Python工程师标准>>> Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本 ...

  4. Java NIO系列教程(五) 通道之间的数据传输

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFro ...

  5. Java NIO系列教程(四) Scatter/Gather

    转载自   Java NIO系列教程(四) Scatter/Gather 译文地址  作者:Jakob Jenkov   译者:郭蕾 Java NIO开始支持scatter/gather,scatte ...

  6. Java NIO系列教程(十) Java NIO DatagramChannel

    转载自  Java NIO系列教程(十) Java NIO DatagramChannel 译文链接    作者:Jakob Jenkov    译者:郑玉婷     校对:丁一 Java NIO中的 ...

  7. Java NIO系列教程(十一) Pipe

    转载自  Java NIO系列教程(十一) Pipe 原文链接     作者:Jakob Jenkov     译者:黄忠       校对:丁一 Java NIO 管道是2个线程之间的单向数据连接. ...

  8. Java NIO系列教程(十 五)Java NIO Path

    转载自  Java NIO系列教程(十 五)Java NIO Path 译文链接  译者:章筱虎 Java的Path接口是Java NIO2 的一部分,是对Java6 和Java7的 NIO的更新.J ...

  9. Java NIO系列教程(一) Java NIO 概述

    一.阻塞IO与非阻塞IO 阻塞IO: 通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至数据能够写入.传统的Server/Client模式会基于TP ...

最新文章

  1. linux shell IFS分隔符 简介 IFS=$‘\n‘ 使用换行符做分隔符
  2. 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 写出或更新配置文件 | 读取配置文件 )
  3. 分布式文件系统研究-搭建图片服务虚拟主机
  4. Kafka发送超过broker限定大小的消息时Client和Broker端各自会有什么异常?
  5. php3源码分析,ThinkPHP3.1.3源码分析(一) 入口文件分析
  6. 操作系统--用户级线程和内核级线程
  7. springmvc 带查询条件的分页,form的控制范围,怎么包裹条件提交给后台
  8. c4d序列号_(图文+视频)野分享:手把手教你免费获取Megascans所有资产并应用于C4D...
  9. java程序设计任务驱动实训教程上海交通大学出版社_清华大学出版社-图书详情-《Java程序设计任务驱动教程》...
  10. [LoadRunner]LR11安装或破解时报错的解决方法
  11. 如何用手机实现高精度定位导航
  12. bilibili手机缓存视频转换为mp4
  13. 用树莓派DIY便携式警报器
  14. 单片机——A/D数模转换篇
  15. 微信小程序 诡异的异步调用问题,函数执行结果与预想不一致
  16. Cesium实战记录(八)三维风场+风速热力图(水平+垂直)
  17. Apache Zeppelin 简单介绍,以及下载地址
  18. Mesh(802.11s)组网 — 基于OpenWRT路由器
  19. 测试工具和测试自动化
  20. 电脑待机服务器没有响应,电脑和服务器的CPU的uncore待机功耗显示异常的问题

热门文章

  1. css布局中的居中问题
  2. 二叉树简介及C++实现
  3. Linux下多线程编程互斥锁和条件变量的简单使用
  4. 5个java框架及其优缺点_各种Java Web框架的优缺点是什么?
  5. bootstrap 时间线_股票配资均量线的实战用法绝技是什么?怎么用它判断买卖点?...
  6. python函数编程求三个数的最小公倍数_Python求三个数的最小公倍数
  7. Redis初学:2(Redis的启动)
  8. echart x轴标签偏移_移动端H5页面滑动手势X轴实例
  9. 【java】兴唐第二十九节课作业
  10. mac tomcat https