赞
踩
系列文章:
Android NIO 系列教程(一) NIO概述
Android NIO 系列教程(二) – Channel
Android NIO 系列教程(三) – Buffer
Android NIO 系列教程(四) – Selector
Android NIO 系列教程(五) – FileChannel
Android NIO 系列教程(六) – SocketChannel
Android NIO 系列教程(七) – ServerSocketChannel
Android NIO 系列教程(八) --NIO简易聊天室
在上面几章,我们已经对 Channel 有了一定的了解,这章继续来学习这几个 channel
FileChannel 是 Java NIO 中一个连接文件的通道,使用 FileChannel 你可以从 文件中读取数据和写入数据;FileChannel 是阻塞IO的,这点需要注意,其他的可以参考 javadoc。
我们无法直接创建FileChannel,但可以使用 InputStream, OutputStream, 或者 RandomAccessFile 来拿到 FileChannel,比如通过 RandomAccessFile :
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
读取数据可以使用 read() 方法:
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
首先创建 buffer,接着通过 read 方法,把 channel 的数据读取到buffer 中,其中返回的字节大小为读取的字节大小,当返回 -1 时,表示已经读到文件末尾。
写数据可以使用 write() 方法,用 buffer 作为参数:
String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
channel.write(buf);
}
注意写数据这里,用到了 while循环,因为我们不确定有多少字节会被写入。
使用 close() 方法即可:
channel.close();
当我们读写数据都通制定的 position ,我们可以使用 FileChannel 中的 position() 方法获取该特定点,通过 position(long pos) 设置位置:
long pos channel.position();
channel.position(pos +123);
假设我们把 position 设置为 文件结尾,再去读取这个 channel,将会返回 -1,
假设我们把 position 设置为文件结尾,然后写入数据,channel 会自动扩容并填充数据,但这会导致一些位置没有数据,即空洞问题。
size() 方法可以返回 FileChannel 对应的文件大小。
long fileSize = channel.size();
可以通过 FileChannel.truncate() 方法截取指定长度的文件:
channel.truncate(1024);
FileChannel.force() 方法会把还未写入的数据全部导入磁盘,类似于 flush,会把缓冲的数据一并输出到磁盘中,它的返回值为 boolean 值:
channel.force(true);
下一章,我们来讲解 tcp 与 udp 相关的 channel
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。