首页 > 编程 > Java > 正文

Java NIO学习笔记

2019-11-06 06:56:26
字体:
来源:转载
供稿:网友

http://ifeve.com/java-nio-all/

java.nio.Channel.java

channel表示对于如硬件设备、文件、网络socket或PRogram component等实体的一个打开的连接,提供一个或多个不同的I/O方法,如读和写。channel要么打开,要么关闭。一旦创建即打开,一旦关闭,就一直关闭。当通道关闭后,任何I/O方法都会抛出ClosedChannelException异常。channel是线程安全的。

与流的不同

既可以从通道读数据,也可以写数据。而流的读写是单向的通道可以异步读写通道中的数据总是要先读到一个Buffer或总是要从一个Buffer读入

不同实现

FileChannel 从文件中读写数据。DatagramChannel 能通过UDP读写网络中的数据。SocketChannel 能通过TCP读写网络中的数据。ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。 //使用FileChannel读取文件 public static void main(String[] args) throws IOException { RandomaccessFile accessFile=new RandomAccessFile("input.txt","rw"); FileChannel fileChannel=accessFile.getChannel(); ByteBuffer buf=ByteBuffer.allocate(10); int bytesRead=fileChannel.read(buf); while(bytesRead!=-1){ System.out.println("Read"+bytesRead); buf.flip(); while(buf.hasRemaining()){ System.out.print((char)buf.get()); } buf.clear(); bytesRead=fileChannel.read(buf); System.out.println(); } fileChannel.close(); accessFile.close(); }

java.nio.Buffer.java

buffer是一个线性、有限元素序列,存放特定的基本数据类型。capacity是buffer可以容纳元素的数目limit表示从下标limit开始,后面的元素都不再读或写了position是下一个要读或写的元素下标实例对象本质上是一块可写可读的内存区域一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。 //通道read到buffer,然后要get的时候用;或者put完,通道要把buffer write的时候 public final Buffer flip() { limit = position; position = 0; mark = -1; return this; } //重读 public final Buffer rewind() { position = 0; mark = -1; return this; }通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position。equals()只比较Buffer中的剩余元素是否相等。compareTo()方法比较两个Buffer的剩余元素
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表