美文网首页
[Java NIO]通道Channel

[Java NIO]通道Channel

作者: 檀香灰 | 来源:发表于2020-08-06 00:01 被阅读0次

一.通道介绍

1.1 通道(channel)

  • 用于在字节缓冲区和位于通道的另一测的实体(通常是文件或套接字)之间有效的传输数据。
  • 多数情况下,通道与操作系统文件描述符(File Descriptor) 和 文件句柄 (File Handler) 有着一对一的关系。

1.2 通道

1.通道接口

public interface Channel extends Closeable {
        // 检查通道是否开启
        public boolean isOpen();
        // 关闭通道
        public void close() throws IOException;
}

常用的几个接口:
1).ReadableByteChannel

public interface ReadableByteChannel extends Channel {
    public int read (ByteBuffer dst) throws IOException;
}

2).WritableByteChannel

public interface WritableByteChannel extends Channel { 
    public int write (ByteBuffer src) throws IOException; 
}

3).ByteChannel

public interface ByteChannel extends ReadableByteChannel, WritableByteChannel { 
}

说明:
ByteBuffer:通道是将数据传给ByteBuffer,或者从ByteBuffer 对象获取数据来传输。
ByteChannel接口:本身并不定义新的API方法,它是一种用来聚集它自己以一个新名称继承的多个接口的便捷接口

2.打开通道
1).Socket 通道可以通过Socket 通道的工厂方法直接创建:

SocketChannel sc = SocketChannel.open( ); 
sc.connect (new InetSocketAddress ("somehost", someport)); 

ServerSocketChannel ssc = ServerSocketChannel.open( ); 
ssc.socket( ).bind (new InetSocketAddress (somelocalport)); 

2).FileChannel 不能直接创建,只能通过在一个打开的RandomAccessFile、FileInputStream或FileOutputStream对象上调用getChannel( )方法来获取。

DatagramChannel dc = DatagramChannel.open( ); 
RandomAccessFile raf = new RandomAccessFile ("somefile", "r"); 
FileChannel fc = raf.getChannel( );

二.文件通道(FileChannel)

2.1 通道(channel)

1.FileChannel 是一个反映Java 虚拟机外部一个具体对象的抽象。
2.文件通道总是阻塞式的,因此不能被置于非阻塞模式。
3.FileChannel 对象是线程安全的

  • 多个进程可以在同一个实例上并发调用方法,而不会引起任何问题。
  • 并非所有的操作都是多线程的(multithreaded),影响通道位置或者影响文件大小的操作都是单线程的(single-threaded)。

2.2 FileChannel 抽象接口

public abstract class FileChannel extends AbstractChannel implements ByteChannel, GatheringByteChannel, ScatteringByteChannel { 
    // This is a partial API listing 
    public abstract long position( ) 
    public abstract void position (long newPosition) 
    public abstract int read (ByteBuffer dst) 
    public abstract int read (ByteBuffer dst, long position) 
    public abstract int write (ByteBuffer src) 
    public abstract int write (ByteBuffer src, long position) 
    public abstract long size( )
    public abstract void truncate (long size) 
    public abstract void force (boolean metaData) 
}

1.file position:position 决定文件中哪一处的数据接下来被读或者写。
2.FileChannel 位置 (position) 是从底层的文件描述符获得的,一个对象对该position 的更新可以被另一个对象看到。

相关文章

  • Java NIO Channel

    Channel(通道) 定义 Channel(通道)定义在java.nio.channels包中。Channel表...

  • Java NIO(4) - 通道(1)

    3.6 通道(channel)简介 通道(Channel):由 java.nio.channels 包定的。Cha...

  • Java NIO——通道Channel

    Channel 通道的简介 通道( Channel):由 java.nio.channels 包定义的。 Chan...

  • NIO 之 Channel

    可参考之前写过的文章:NIO 之 Channel实现原理 概述 通道( Channel)是 java.nio 的主...

  • Java NIO(2) - 缓冲区(Buffer)

    3. 缓冲区(Buffer)和通道(Channel) Java NIO系统的核心在于:通道(Channel)和缓冲...

  • NIO

    一、Java NIO 概述 二、Java NIO vs. IO 三、通道(Channel): 四、缓冲区(Buff...

  • Java NIO

    java Nio Selector 选择器Buffer 缓冲器Channel 通道 Selector是NIO的核心...

  • java NIO(一)Channel

    java NIO(一)Channel nio中的channel与流的区别在于,流的读写通常是单向的,而通道可以异步...

  • Java NIO 通道(Channel)

    Java NIO 通道(Channels )与流类似但也有一些区别: 您可以读取和写入通道,流通常是单向的(读或写...

  • [Java NIO]通道Channel

    一.通道介绍 1.1 通道(channel) 用于在字节缓冲区和位于通道的另一测的实体(通常是文件或套接字)之间有...

网友评论

      本文标题:[Java NIO]通道Channel

      本文链接:https://www.haomeiwen.com/subject/ybqrrktx.html