NIO(二): 通道 Channel

 

一:channel

        用于 I/O 操做的链接。安全

        通道表示到实体,如硬件设备、文件、网络套接字或能够执行一个或多个不一样 I/O 操做(如读取或写入)的程序组件的开放的链接。服务器

        通道可处于打开或关闭状态。建立通道时它处于打开状态,一旦将其关闭,则保持关闭状态。一旦关闭了某个通道,试图对其调用 I/O 操做就会致使 ClosedChannelException 被抛出。经过调用通道的 isOpen 方法可测试通道是否处于打开状态。网络

        正如扩展和实现此接口的各个接口和类规范中所描述的,通常状况下通道对于多线程的访问是安全的。多线程

public interface Channelextends Closeable

 

二:channel 与流比较并发

       Java NIO 的channel相似流,可是有不一样,dom

                既能够从通道中读取数据,又能够写数据到通道。但流的读写一般是单向的。异步

                通道能够异步地读写。测试

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

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

                                                                                                    

 

JAVA NIO中的一些主要Channel的实现:

FileChannel : 用于读取、写入、映射和操做文件的通道。(多个并发线程可安全地使用文件通道。)

DatagramChannel : 针对面向数据报套接字的可选择通道。(数据报通道不是网络数据报套接字的完整抽象。)

SocketChannel : 针对面向流的链接套接字的可选择通道。(套接字通道不是链接网络套接字的完整抽象)

ServerSocketChannel :针对面向流的侦听套接字的可选择通道。(服务器套接字通道不是侦听网络套接字的完整抽象。)

即:

FileChannel 从文件中读写数据。

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

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

ServerSocketChannel能够监听新进来的TCP链接,像Web服务器那样。对每个新进来的链接都会建立一个SocketChannel。

 

基本的channel示例

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

public class Test1Channel {

	public static void main(String[] args) throws IOException {

//		File file = new File("data/niodata.txt");
//		RandomAccessFile aFile = new RandomAccessFile(file, "rw");
		
		//建立从中读取和向其中写入(可选)的随机访问文件流
		RandomAccessFile aFile = new RandomAccessFile("data/niodata.txt", "rw");
		
		System.out.println(aFile.length());	 // 返回此文件的长度。
		
		//FileChannel:用于读取、写入、映射和操做文件的通道。 
		//从文件中读写数据。
		FileChannel inChannel = aFile.getChannel();
		
		//allocate(20) 分配一个新的字节缓冲区。
		ByteBuffer buf = ByteBuffer.allocate(10);

		// read(buf) 将字节序列今后通道读入给定的缓冲区。
		int bytesRead = inChannel.read(buf); 
		
		while (bytesRead != -1) {

			//System.out.println("Read " + bytesRead);
			
			buf.flip().position(); // 反转缓冲区 

			//hasRemaining():告知在当前位置和限制之间是否还有元素。
			while(buf.hasRemaining()){
				System.out.print((char) buf.get()+ "  ");
			}

			buf.clear(); // 清除此缓冲区。
			
			bytesRead = inChannel.read(buf);
		}
		aFile.close();
	}

}

 

 

注意:


public RandomAccessFile(String name,String mode):

        

mode 参数指定用以打开文件的访问模式。容许的值及其含意为:

含意

"r"

以只读方式打开。调用结果对象的任何 write 方法都将致使抛出 IOException

"rw"

打开以便读取和写入。若是该文件尚不存在,则尝试建立该文件。

"rws"

打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每一个更新都同步写入到底层存储设备。

"rwd"  

打开以便读取和写入,对于 "rw",还要求对文件内容的每一个更新都同步写入到底层存储设备。

相关文章
相关标签/搜索