博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nio之channel
阅读量:5208 次
发布时间:2019-06-14

本文共 2116 字,大约阅读时间需要 7 分钟。

Java NIO的通道类似流,但又有些不同:

  • 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。
  • 通道可以异步地读写。
  • 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

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

下面是一个用nio的channel读文件的例子

public static void nioReadFile() throws IOException {        System.out.println("nio begin");        RandomAccessFile raf = new RandomAccessFile("D:\\test1.txt","rw");        RandomAccessFile rafc = new RandomAccessFile("D:\\test1.txt","rw");        //读取通道        FileChannel fc = raf.getChannel();        System.out.println("beg1:  " + fc.size());        FileChannel fc2 = rafc.getChannel();        System.out.println("beg2:  " + fc2.size());        ByteBuffer buffer =  ByteBuffer.allocate(150);        ByteBuffer buffer1 =  ByteBuffer.allocate(150);        //j将channel读入buffer        int by = fc.read(buffer);        System.out.println("beg:  " + fc.size());        int byd = fc2.read(buffer1);        System.out.println("beg213:  " + byd);        while (by != -1){//-1时说明没有内容(一个chaneel只能读一次?)            //回归position 因为之前读过一次            buffer.flip();            System.out.println("posi2: " + buffer.position());            String  a = "";            while (buffer.hasRemaining()){               // System.out.println("ppdfdf1: " + buffer.position());                char ab= (char)buffer.get();                a = a + ab;                //System.out.println(ab);                //System.out.println("ppsdfsdf2: " + buffer.position());            }            System.out.println("sb:s1 "  + buffer.position());            buffer.clear();            by = fc.read(buffer);        }        raf.close();    }    public static  void test() throws Exception {        //声明randowFile        RandomAccessFile a = new RandomAccessFile("D:\\test1.txt", "rw");        //获取channel        FileChannel fc = a.getChannel();        ByteBuffer buffer = ByteBuffer.allocate(500);        //用buffer读入channerl        fc.read(buffer);        //buffeer回归初始position        buffer.flip();        while (buffer.hasRemaining()){            System.out.print((char)buffer.get());        }        fc.close();    }

 

 

转载于:https://www.cnblogs.com/zhuangyan728/p/6629605.html

你可能感兴趣的文章
ribbon负载均衡
查看>>
Extjs之Renderer方法中的参数详解
查看>>
JQuery EasyUi之界面设计——通用的JavaScript
查看>>
如果CDN服务器出了问题,怎么做不影响自己的网站
查看>>
OpenCV之头文件分析
查看>>
WPF之Manipulation
查看>>
高效率工具
查看>>
关于CefSharp的坎坷之路
查看>>
WPF中获取鼠标相对于桌面位置
查看>>
关于SQL Server 2017中使用json传参时解析遇到的多层解析问题
查看>>
2013 lost connection to mysql server during query
查看>>
Android零基础入门第18节:EditText的属性和使用方法
查看>>
WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
查看>>
WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu
查看>>
WPF 读写TxT文件
查看>>
Crystal Report 在 VS 2010 中的使用和发布
查看>>
关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单等相关问题...
查看>>
C#照片批量压缩小工具
查看>>
Shuttle ESB 实践
查看>>
react.js 之 create-react-app 命令行工具系统讲解
查看>>