二、Nio之Channel

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

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

  通道可以异步地读写。

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

2、Channel  的实现

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

  FileChannel

  DatagramChannel

  SocketChannel

  ServerSocketChannel

FileChannel 从文件中读写数据。

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

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

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

3、基本Channel示例:

Java Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* nio channel 读取数据到buffer示例
* Created by 321695 on 2016/11/8.
*/

public   class FileChannelTest {
   
public   static   void main( String [] args) {
        RandomAccessFile randomAccessFile = null;

       
try {
           
//实例化randomAccessFile
            randomAccessFile = new RandomAccessFile( "E:/Dubbox/dubbo/nio-demo/src/main/resources/linux.txt" , "rw" );

           
//获取文件传输通道实例
            FileChannel fileChannel = randomAccessFile.getChannel();

           
//创建一个容量为48字节的buffer
            ByteBuffer buffer = ByteBuffer.allocate( 48 );

           
//读取数据到buffer中
            int bytesRead = fileChannel.read(buffer);

           
while (bytesRead != - 1 ) {

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

               
//反转buffer
                buffer.flip();

               
//若buffer中还有元素,打印出来
                while (buffer.hasRemaining()) {
                    System.out.print((
char ) buffer.get());
                }

               
//清空buffer
                buffer.clear();

               
//继续处理未完成数据
                bytesRead = fileChannel.read(buffer);

            }

           
//文件操作对象关闭
            randomAccessFile.close();
        }
catch (FileNotFoundException e) {
            e.printStackTrace();
        }
catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java NIO中的Channel是用于在Java程序中进行I/O操作的基本组件之一。Channel提供了一种高效的、可扩展的方式来进行数据传输,同时也支持非阻塞式I/O操作。 下面是一些常用的Channel方法: 1. `open()`:打开一个新的Channel对象。 2. `close()`:关闭当前的Channel对象。 3. `read(ByteBuffer dst)`:从Channel中读取数据到指定的ByteBuffer中。 4. `write(ByteBuffer src)`:将数据从指定的ByteBuffer写入到Channel中。 5. `configureBlocking(boolean block)`:设置当前Channel的阻塞模式,如果为true则为阻塞模式,如果为false则为非阻塞模式。 6. `register(Selector sel, int ops)`:将当前的Channel对象注册到指定的Selector中,并且指定关注的事件类型。 7. `isOpen()`:判断当前的Channel对象是否处于打开状态。 8. `isConnected()`:判断当前的Channel对象是否已经连接到远程服务器。 9. `finishConnect()`:完成Channel对象的连接操作,如果连接成功则返回true,否则返回false。 10. `bind(SocketAddress local)`:将当前的Channel对象绑定到指定的本地地址。 11. `getRemoteAddress()`:获取当前Channel对象连接的远程服务器地址。 12. `getLocalAddress()`:获取当前Channel对象绑定的本地服务器地址。 这些方法提供了基本的Channel操作,可以根据具体的需求进行使用。需要注意的是,Channel对象在使用完毕后需要调用close()方法进行关闭,否则可能会出现资源泄漏等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值