讲到NIO 不妨从老的IO 说起。
老的I/O 核心接口有2个: 一个是 InputStream/OutputStream (字节流),一次处理一个字节,Reader/Writer (字符流) ,一次处理一个字符。
NIO 是从JDK 1.4 才有的,她最基本的数据类型是Channel 和Buffer.
Channel表示数据的源头或者目的地,用于向Buffer提供数据或者读取Buffer的数据。
Buffer是一个连续的内存块,是NIO数据读写的中转地.
NIO有7种基本的Buffer类型,每种类型对应一个基本类型。
Buffer的结构包含3个变量
position: 读操作时(当前读的位置) / 写操作时(写了多少)
limit: 读操作时候(最多能读多少,等同于已经写的量) /写操作时候(最多能写多少,等同于整个buffer的容量)
capacity: 读操作时候(buffer容量) / 写操作时候(buffer容量)
Buffer的常见方法:
flip(): 在读模式和写模式之间进行切换
clear():清空Buffer
以下是一些小例子:
(1) NIO 从网络上读内容 ,我们这里演示从Baidu 上读取内容
-
-
-
-
-
- public class BaiduReader {
-
- private Charset charset=Charset.forName("GBK");
- private SocketChannel channel;
- public void readHTMLContext(){
- try{
- System.out.println("Start reading the HTML context...");
- InetSocketAddress socketAddress = new InetSocketAddress ("www.baidu.com",80);
-
-
- channel = SocketChannel.open(socketAddress);
-
- channel.write(charset.encode("GET "+"/ HTTP/1.1"+"\r\n\r\n"));
-
- ByteBuffer buffer =ByteBuffer.allocate(1024);
-
- while(channel.read(buffer) != -1 ){
- System.out.println(1);
- buffer.flip();
-
- System.out.println(charset.decode(buffer));
- buffer.clear();
- }
-
-
- }catch(IOException ex){
- System.err.println(ex.toString());
- }finally{
- if(channel != null){
- try{
- channel.close();
- }catch(IOException e){
- e.printStackTrace();
- }
- }
- }
- }
-
-
-
- public static void main(String[] args) {
-
- new BaiduReader().readHTMLContext();
- }
-
-
-
- }
(2)采用NIO来进行基于块的复制文件
-
-
-
-
-
- public class CopyFile {
-
-
-
-
- public static void main(String[] args)throws Exception {
-
- String infile="d:\\copyfrom.txt";
- String outfile="d:\\copyto.txt";
-
- FileInputStream fin = new FileInputStream(infile);
- FileOutputStream fout = new FileOutputStream(outfile);
-
-
- FileChannel fcin = fin.getChannel();
- FileChannel fcout=fout.getChannel();
-
- ByteBuffer buffer = ByteBuffer.allocate(1024);
- while(true){
-
- buffer.clear();
-
- int r = fcin.read(buffer);
-
- if(r==-1)
- break;
-
- buffer.flip();
-
- fcout.write(buffer);
- }
-
- }
-
- }
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/840636,如需转载请自行联系原作者