JAVA之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的更多细节
Atas ialah kandungan terperinci JAVA之Channel详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Saluran dalam bahasa Go ialah mekanisme untuk komunikasi dan penyegerakan data antara coroutine. Boleh dianggap sebagai jenis data khas, serupa dengan baris gilir atau paip, digunakan untuk memindahkan data antara coroutine yang berbeza. Saluran menyediakan dua operasi utama: hantar dan terima. Kedua-dua operasi hantar dan terima dalam saluran disekat, yang bermaksud bahawa jika tiada penghantar atau penerima sedia, operasi akan disekat sehingga coroutine bersedia untuk melaksanakan operasi yang sepadan, dsb.

Bahasa Go menggunakan saluran dan goroutine untuk berkomunikasi. Selepas mencipta saluran, goroutine boleh lulus

Bagaimana untuk menyelesaikan masalah penyusunan semula tugas serentak dalam bahasa Go? Dalam pengaturcaraan serentak, susunan pelaksanaan tugas selalunya tidak pasti, yang mungkin menyebabkan beberapa masalah, terutamanya untuk tugasan dengan kebergantungan. Dalam bahasa Go, kita boleh menyelesaikan masalah penyusunan semula tugas serentak dengan menggunakan saluran dan coroutine. Di bawah ini kami akan menerangkan secara terperinci bagaimana untuk mencapai ini. Biasanya, kami menggunakan saluran untuk mencapai penyegerakan dan komunikasi tugas. Dalam bahasa Go, saluran boleh digunakan sebagai primitif penyegerakan peringkat lebih tinggi untuk memastikan susunan pelaksanaan tugas. dengan menggunakan penimbal

1. Jelaskan bahawa Saluran ialah objek yang melaluinya data boleh dibaca dan ditulis. Ia boleh dilihat sebagai aliran dalam IO. Tetapi berbanding dengan strim, ia mempunyai beberapa perbezaan: Saluran adalah dwiarah dan boleh dibaca atau ditulis, manakala strim adalah sehala. Saluran boleh dibaca dan ditulis secara tidak segerak. Membaca dan menulis saluran mesti melalui objek penimbal. 2. Contoh dilengkapkan menggunakan saluran dan penimbal tidak langsung. FileInputStreamfis=null;//Reference FileOutputStreamfout=null;FileChannelchannel=null;//Channel reference FileChanneloutchannel=null;try{fi

Dalam bahasa Go, saluran ialah mekanisme penting untuk mencapai komunikasi serentak. Ia menyediakan cara untuk menghantar data dari satu goroutine ke yang lain, dengan itu mencapai penyegerakan dan kerjasama data. Artikel ini akan memperkenalkan penggunaan asas saluran dalam bahasa Go dan beberapa langkah berjaga-jaga. 1. Pengisytiharan dan pemulaan saluran Dalam bahasa Go, mengisytiharkan saluran memerlukan menggunakan fungsi make() Contoh

Golang ialah bahasa pengaturcaraan yang sangat popular yang digunakan secara meluas dalam pengaturcaraan rangkaian, pengkomputeran awan, pengaturcaraan serentak dan bidang lain. Antaranya, saluran dan mutex adalah konsep penting dalam pengaturcaraan Golang. Mereka boleh membantu kami menyelesaikan beberapa masalah dalam pengaturcaraan serentak. Artikel ini akan memperkenalkan cara menggunakan saluran dan mutex fungsi Golang. 1. Apakah saluran? Di Golang, saluran ialah jenis data yang boleh digunakan dalam Gor yang berbeza

Pakej penyegerakan menyediakan primitif penyegerakan asas seperti kunci mutex. Kecuali untuk jenis Once dan WaitGroup, kebanyakan jenis lain ditujukan untuk pustaka fungsi asas. Penyegerakan tahap yang lebih tinggi lebih baik dicapai melalui saluran dan komunikasi.

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