博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java NIO FileChannel
阅读量:6083 次
发布时间:2019-06-20

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

A Java NIO FileChannel is a channel that is connected to a file. Using a file channel you can read data from a file, and write data to a file. The Java NIO FileChannel class is NIO's an alternative to .

A FileChannel cannot be set into non-blocking mode. It always runs in blocking mode.

Opening a FileChannel

Before you can use a FileChannel you must open it. You cannot open a FileChannel directly. You need to obtain a FileChannel via an InputStream, OutputStream, or a RandomAccessFile. Here is how you open a FileChannel via a RandomAccessFile:

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

Reading Data from a FileChannel

To read data from a FileChannel  you call one of the read() methods. Here is an example:

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

First a  Buffer is allocated. The data read from the  FileChannel is read into the Buffer .

Second the FileChannel.read() method is called. This method reads data from the  FileChannel into the Buffer . The int returned by the read() method tells how many bytes were witten into the Buffer . If -1 is returned, the end-of-file is reached.

Writing Data to a FileChannel

Writing data to a  FileChannel is done using the  FileChannel.write() method, which takes a Buffer  as parameter. Here is an example:

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);}

Notice how the  FileChannel.write() method is called inside a while-loop. There is no guarantee of how many bytes the write() method writes to the FileChannel. Therefore we repeat the write() call until the Buffer has no further bytes to write.

Closing a FileChannel

When you are done using a  FileChannel you must close it. Here is how that is done:

channel.close();

FileChannel Position

When reading or writing to a  FileChannel you do so at a specific position. You can obtain the current position of the FileChannel object by calling the position() method.

You can also set the position of the  FileChannel by calling the position(long pos) method.

Here are two examples:

long pos channel.position();channel.position(pos +123);

If you set the position after the end of the file, and try to read from the channel, you will get -1 - the end-of-file marker.

If you set the position after the end of the file, and write to the channel, the file will be expanded to fit the position and written data. This may result in a "file hole", where the physical file on the disk has gaps in the written data.

FileChannel Size

The size()  method of the  FileChannel object returns the file size of the file the channel is connected to. Here is a simple example:

long fileSize = channel.size();

FileChannel Truncate

You can truncate a file by calling the  FileChannel.truncate() method. When you truncate a file, you cut it off at a given length. Here is an example:

channel.truncate(1024);

This example truncates the file at 1024 bytes in length.

FileChannel Force

The  FileChannel.force() method flushes all unwritten data from the channel to the disk. An operating system may cache data in memory for performance reasons, so you are not guaranteed that data written to the channel is actually written to disk, until you call the force() method.

The force() method takes a boolean as parameter, telling whether the file meta data (permission etc.) should be flushed too.

Here is an example which flushes both data and meta data:

 

channel.force(true);

 

Ref:

转载地址:http://wykwa.baihongyu.com/

你可能感兴趣的文章
maven jar 导入本地仓库
查看>>
ExtentTestNGIReporterListener
查看>>
UIView
查看>>
Layer Filters
查看>>
微信小程序 解决 数字粗细不一 的bug
查看>>
mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能
查看>>
FJ省队集训最终测试 T2
查看>>
PHP csv文件内容转成数组/Json
查看>>
[结题报告]11479 - Is this the easiest problem? Time limit: 1.000 seconds
查看>>
php中使用linux命令四大步骤
查看>>
neo4j安装与示例
查看>>
ExceptionLess新玩法 — 记日志
查看>>
RabbitMQ 集群
查看>>
启动jetty命令
查看>>
C#获取当前时间与同步时间
查看>>
端口被占用了,使用netstat找到占用端口的进程
查看>>
springboot的profile配置
查看>>
c++ 指针与 typedef
查看>>
委托-匿名方法-Lambda表达式
查看>>
MPF配置文件参数管理
查看>>