欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NIO(六)—— NIO中的几个基础概念之一:Channel

程序员文章站 2022-04-24 10:52:11
...

在NIO中有几个比较关键的概念:Channel,Buffer,Selector。

 

1. Channel(通道)

         顾名思义,就是通向什么的道路,为某个提供了渠道。

         在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:  

package com.mycom.test.nio;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestIO {	
	public static void main(String[] args) {
		try {
			File file = new File("d:/data.txt");
			InputStream inputStream = new FileInputStream(file);
			byte[] bytes = new byte[1024];
			inputStream.read(bytes);
			inputStream.close();
			System.out.println(new String(bytes));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
 这里的InputStream实际上就是为读取文件提供一个的通道。  

         但是,在传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。而NIO中Channel是双向的,既可用来进行读操作,又可用来进行写操作

以下是常用的几种通道: 

  • FileChannel:可以从文件读或者向文件写入数据;
  • SocketChanel:以TCP来向网络连接的两端读写数据;
  • ServerSocketChannel:能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的Socket Channel来进行数据读写;
  • DatagramChannel:以UDP协议来向网络连接的两端读写数据。

下面给出通过FileChannel来向文件中写入数据的一个例子: 

package com.mycom.test.nio;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * FileChannel读取文件
 * 
 * @author guweiqiang
 */
public class TestFileChannel {

	public static void main(String[] args) {
		try {
			File file = new File("d:/writeData.txt");
			FileOutputStream outputStream = new FileOutputStream(file);
			FileChannel fileChannel = outputStream.getChannel();
			ByteBuffer buffer = ByteBuffer.allocate(1024);
			String ss = "hello world!";
			buffer.put(ss.getBytes());
			buffer.flip(); //此处必须要调用buffer的flip方法
			fileChannel.write(buffer);
			fileChannel.close();
			outputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}		
	}
}

通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio",注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容(flip方法的作用是首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据)。