Channel
Channel
- 一个
Channel 可以读和写,而一个流一般只能读或者写 Channel 可以异步(asynchronously) 的读和写Channel 总是需要一个Buffer ,不管是读到Buffer 还是从Buffer 写到Channel
因为
FileChannel 读取数据或者写入数据到文件中DatagramChannel 读写数据通过UDP 协议SocketChannel 读写数据通过TCP 协议ServerSocketChannel 提供TCP 连接的监听,每个进入的连接都会创建一个SocketChannel 。
数据读取
在前面我们说过,任何时候读取数据,都不是直接从通道读取,而是从通道读取到缓冲区。所以使用
- 从
FileInputStream 获取Channel - 创建
Buffer - 将数据从
Channel 读取到Buffer 中
下面是一个简单的使用
FileInputStream fin = new FileInputStream("test");
// 获取通道
FileChannel fc = fin.getChannel();
// 创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 读取数据到缓冲区
fc.read(buffer);
buffer.flip();
while (buffer.remaining()>0) {
byte b = buffer.get();
System.out.print(((char)b));
}
fin.close();
我们也可以使用
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
数据写入
使用
- 从
FileInputStream 获取Channel - 创建
Buffer - 将数据从
Channel 写入到Buffer 中
下面是一个简单的使用
static private final byte message[] = { 83, 111, 109, 101, 32, 98, 121, 116, 101, 115, 46 };
static public void main( String args[] ) throws Exception {
FileOutputStream fout = new FileOutputStream("/test");
FileChannel fc = fout.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
for (int i=0; i<message.length; ++i) {
buffer.put( message[i] );
}
buffer.flip();
fc.write(buffer);
fout.close();
}