Java NIO 的核心组成部分:
1.Channels
2.Buffers
3.Selectors
Java NIO的通道类的功能似流,但又有些不同:
- 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
- 通道可以异步地读写。
- 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
Java NIO中最重要的通道的实现包含四个
FileChannel 从文件中读写数据。
DatagramChannel 能通过UDP读写网络中的数据。
SocketChannel 能通过TCP读写网络中的数据。
ServerSocketChannel可以监听新进来的TCP连接。对每一个新进来的连接都会创建一个SocketChannel。
FileChannel 示例
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ChannelExample {
public static void main(String[] args){
try {
RandomAccessFile aFile = new RandomAccessFile("D:\\logs\\download.info.2017-10-26.log", "rw");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1){
System.out.println("Read " + bytesRead);
//flip()之后,读/写指针position指到缓冲区头部,并且设置了最多只能读出之前写入的数据长度
buf.flip();
//返回剩余的可用长度
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
//读入channel中的数据
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
程序首先将文件与channel关联,随后将channel中的数据读入buffer之中,用户最后读取buffer进而得到文件中数据。
参考链接