当前位置:   article > 正文

Android NIO 系列教程(五) -- FileChannel_android file channel

android file channel

系列文章:
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

我们无法直接创建FileChannel,但可以使用 InputStream, OutputStream, 或者 RandomAccessFile 来拿到 FileChannel,比如通过 RandomAccessFile :

RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
  • 1
  • 2

从 FileChannel 读数据

读取数据可以使用 read() 方法:

ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
  • 1
  • 2

首先创建 buffer,接着通过 read 方法,把 channel 的数据读取到buffer 中,其中返回的字节大小为读取的字节大小,当返回 -1 时,表示已经读到文件末尾。

写数据到 FileChannel

写数据可以使用 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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意写数据这里,用到了 while循环,因为我们不确定有多少字节会被写入。

关闭 FileChannel

使用 close() 方法即可:

channel.close();    
  • 1

FileChannel position

当我们读写数据都通制定的 position ,我们可以使用 FileChannel 中的 position() 方法获取该特定点,通过 position(long pos) 设置位置:

long pos channel.position();
channel.position(pos +123);
  • 1
  • 2

假设我们把 position 设置为 文件结尾,再去读取这个 channel,将会返回 -1,
假设我们把 position 设置为文件结尾,然后写入数据,channel 会自动扩容并填充数据,但这会导致一些位置没有数据,即空洞问题。

FileChannel 大小

size() 方法可以返回 FileChannel 对应的文件大小。

long fileSize = channel.size();    
  • 1

FileChannel 截取

可以通过 FileChannel.truncate() 方法截取指定长度的文件:

channel.truncate(1024);
  • 1

FileChannel Force

FileChannel.force() 方法会把还未写入的数据全部导入磁盘,类似于 flush,会把缓冲的数据一并输出到磁盘中,它的返回值为 boolean 值:

channel.force(true);
  • 1

下一章,我们来讲解 tcp 与 udp 相关的 channel

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/319297
推荐阅读
相关标签
  

闽ICP备14008679号