【Java SE】Java NIO系列教程(二) Channel

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

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

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

Channel的实现

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

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

FileChannel 从文件中读写数据。

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

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

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

基本的 Channel 示例

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

01

RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");

02

FileChannel inChannel = aFile.getChannel();

03

04

ByteBuffer buf = ByteBuffer.allocate(48);

05

06

int bytesRead = inChannel.read(buf);

07

while (bytesRead != -1) {

08

09

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

10

buf.flip();

11

12

while(buf.hasRemaining()){

13

System.out.print((char) buf.get());

14

}

15

16

buf.clear();

17

bytesRead = inChannel.read(buf);

18

}

19

aFile.close();

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

(全文完)

原文发布于微信公众号 - 架构师之旅(TravelWithFrame)

原文发表时间:2016-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏米扑专栏

Linux iptables 防火墙常用规则

上面这两条,请注意--dport为目标端口,当数据从外部进入服务器为目标端口;反之,数据从服务器出去则为数据源端口,使用 --sport 同理,-s是指定源地址...

49212
来自专栏iOS技术杂谈

iOS网络——AFNetworking AFHttpSessionManager源码解析

你要知道的NSURLSession都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本...

6478

在Debian上安装McMyAdmin for Minecraft

McMyAdmin是最受欢迎的Minecraft服务器控制面板之一。它拥有与第三方mod的兼容性,专注于服务器安全性和管理服务器的Web界面流畅性。本指南介绍了...

941
来自专栏蓝天

iptables简单应用

可以修改/etc/rc.d/boot.local让规则重启后也能生效,如: /sbin/iptables -F /sbin/iptables -A INP...

1053
来自专栏Netkiller

Struts2 S2-046, S2-045 Firewall(漏洞防火墙)

开发中遇到一个问题,Struts2 已经升级到2.3.32但是故障依旧,绞尽脑汁找不出原因。此路不同另寻它路,我便想从运维角度暂时解决这个问题,给开发留出足够的...

2996
来自专栏CaiRui

Iptables防火墙

1、简介 iptables是linux/unix自带的一款开源基于包过滤的防火墙工具,使用非常灵活,对硬件资源需求不是很高,是在内核中集成的服务,主要工作在OS...

5688
来自专栏Java技术栈

Spring Enable*高级应用及原理

Enable* 之前的文章用到了一些Enable*开头的注解,比如EnableAsync、EnableScheduling、EnableAspectJAutoP...

4488
来自专栏米扑专栏

Linux iptables 防火墙常用规则

3527
来自专栏运维小白

linux基础(day 33)

10.11 Linux网络相关 linux网络相关 ifconfig命令,可以查看虚拟网卡,而ip addr命令则不能查看 ifconfig查看网卡ip(yum...

2669
来自专栏ml

linux开关端口问题

linux开关端口问题: 我们知道一些常用的端口,比如mysql的端口为3306,sql的端口为:1433,以及tomcat的端口为 8008等等一样! ...

8886

扫码关注云+社区

领取腾讯云代金券