目录
Channel
一、Channel的实现
二、基本的 Channel 示例
首页 Java java教程 JAVA之Channel详解

JAVA之Channel详解

Jun 25, 2017 am 10:14 AM
channel

注意:转载自并发编程网 – ifeve.com本文链接地址: Java NIO系列教程(二) Channel

Channel

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

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

  • 通道可以异步地读写。

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

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

 

一、Channel的实现

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

  • FileChannel

  • DatagramChannel

  • SocketChannel

  • ServerSocketChannel

FileChannel 从文件中读写数据。

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

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

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

二、基本的 Channel 示例

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

public class Channel1 {public static void main(String[] args) {try {
            RandomAccessFile raf = new RandomAccessFile("./.gitignore","rw");
            FileChannel channel = raf.getChannel();     //获取通道ByteBuffer bf = ByteBuffer.allocate(50);    //通过静态allocate方法创建一个缓冲区,容量为50byte[] bytes = new byte[]{};
            bytes = "123".getBytes();
            bf = ByteBuffer.wrap(bytes);                //通过静态wrap方法,byte数组生成缓冲区,缓冲区中保留了原数据while(bf.hasRemaining()){
                System.out.print((char) bf.get());
            }int bytesRead ;while ((bytesRead = channel.read(bf)) != -1) {      //将通道中的数据写入缓冲区,并判断通道中的数据是否到末尾System.out.println("Read " + bytesRead);bf.flip();                                      //反转缓冲区 实际上就是将position置为0 后续buffer详细介绍while(bf.hasRemaining()){                       //判断缓冲区中是否还有值System.out.print((char) bf.get());          //输出缓冲区中的值                }
                bf.clear();                                     //清理缓冲区            }
            raf.close();                                        //关闭RandomAccessFile} catch (IOException e) {
            e.printStackTrace();
        }
    }
}
登录后复制

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

以上是JAVA之Channel详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言中的channel是什么意思 Go语言中的channel是什么意思 Dec 14, 2023 pm 02:21 PM

Go语言中的channel是一种用于协程之间进行通信和数据同步的机制。可以被看作是一种特殊的数据类型,类似于队列或管道,用于在不同的协程之间传递数据。Channel提供了两个主要操作:发送(send)和接收(receive)。在channel中发送和接收操作都是阻塞的,这意味着如果没有发送方或接收方准备好,操作将被阻塞,直到有一个协程准备好进行相应的操作等。

golang函数如何通过channel与goroutine通信? golang函数如何通过channel与goroutine通信? May 01, 2024 pm 09:42 PM

Go语言中使用channel和goroutine通信。创建channel后,goroutine可以通过

在Go语言中如何解决并发任务重排序问题? 在Go语言中如何解决并发任务重排序问题? Oct 09, 2023 pm 10:55 PM

在Go语言中如何解决并发任务重排序问题?在并发编程中,任务的执行顺序往往是不确定的,这可能会导致一些问题,特别是对于有依赖关系的任务。在Go语言中,我们可以通过使用通道和协程来解决并发任务重排序问题。下面我们将详细介绍如何实现。通常情况下,我们使用通道来实现任务的同步和通信。在Go语言中,通道可以作为一种更高级的同步原语来保证任务的执行顺序。通过使用有缓冲的

java Channel怎么使用 java Channel怎么使用 Apr 19, 2023 am 11:22 AM

1、说明Channel是一个可以通过它读写数据的对象。它可以被视为IO中的流。但与流相比,它有一些不同:Channel是双向的,可以读也可以写,流是单向的。Channel可以异步读写。Channel的读写必须通过buffer对象。2、实例利用通道和非直接缓冲区完成。FileInputStreamfis=null;//引用FileOutputStreamfout=null;FileChannelchannel=null;//通道引用FileChanneloutchannel=null;try{fi

Go 语言中的 channel 怎样使用? Go 语言中的 channel 怎样使用? Jun 09, 2023 pm 08:13 PM

在Go语言中,channel是实现并发通信的一种重要机制。它提供了一种将数据从一个goroutine传递到另一个goroutine的方式,从而实现数据的同步和协作。本文将介绍Go语言中channel的基本用法和一些注意事项。一、channel的声明和初始化在Go语言中,声明一个channel需要使用make()函数,示例代

学习channel设计:从入门到放弃 学习channel设计:从入门到放弃 Aug 08, 2023 pm 04:33 PM

今天给大家带来的是Go语言中的channel。Go语言从出世以来就以高并发著称,得益于其Goroutine的设计,Goroutine也就是一个可执行的轻量级协程,有了Goroutine我们可以轻松的运行协程,但这并不能满足我们的需求,我们往往还希望多个线程/协程是能够通信的。

学到了!将缓冲 channel 当做 Mutex 来使用 学到了!将缓冲 channel 当做 Mutex 来使用 Aug 08, 2023 pm 04:21 PM

sync 包提供了基本的同步原语,例如互斥锁。除了 Once 和 WaitGroup 类型之外,大多数其他类型都是为底层函数库准备的。通过 channel 和通信更好地完成更高级别的同步。

Golang函数的channel和mutex的使用技巧 Golang函数的channel和mutex的使用技巧 May 16, 2023 am 10:51 AM

Golang是一种非常流行的编程语言,它被广泛应用于网络编程、云计算、并发编程等领域。其中,channel和mutex是Golang编程中比较重要的概念,它们能够帮助我们解决并发编程中的一些问题。本文将会介绍如何使用Golang函数的channel和mutex。一、什么是channel?在Golang中,channel是一种数据类型,它可以用来在不同的Gor

See all articles