【JAVA】【NIO】8、Java NIO FileChannel
2015-03-20 11:02
585 查看
Java NIO的FileChannel是连接文件的通道。通过文件通道,你可以从文件读数据,也可以将数据写到文件中。FileChannel类和标准Java IO API都是可用来读文件的。
FileChannel不能被设置成非阻塞模式。它总是运行在阻塞模式下。
首先,分配一个Buffer,从FileChannel读取的数据会读到Buffer中。
其次,调用read方法,将数据读进Buffer,方法返回的int说明有多少字节数据写进Buffer了。如果返回-1,说明文件读完了。
注意write方法是在一个循环内被调用,不能保证有多少字节写到文件通道里了,所以我们重复调用write方法直到Buffer没有数据了。
你也可以通过调用position(long pos)方法设定文件通道的position。如下:
如果你设置的position在文件末尾之后,从通道读数据会返回-1.
同样如果是写,文件会增大,这可能导致文件空洞,磁盘上的物理文件中写入的数据之间有空隙。
这个图片中的20是空格,和上面的00不一样,本人是想试试这个空洞本质上不是空格。
以上展示了文件空洞。
channel.size和file.length返回的结果是一样的,都是文件的大小,字节数。
如果给定大小小于该文件的当前大小,则截取该文件,丢弃文件新末尾后面的所有字节。如果给定大小大于等于该文件的当前大小,则不修改文件。无论是哪种情况,如果此通道的文件位置大于给定大小,则将位置设置为该大小。
force方法有一个boolean类型的参数,表示是否将文件元数据(权限等)写到磁盘上。如下:
下一节:【JAVA】【NIO】9、Java NIO SocketChannel
FileChannel不能被设置成非阻塞模式。它总是运行在阻塞模式下。
打开文件通道
在你使用文件通道之前必须打开它。你不能直接打开文件通道。你需要通过InputStream,OutputStream或者RandomAccessFile来获取文件通道。如下:RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw"); FileChannel fromChannel = fromFile.getChannel();
从文件通道读数据
通过read方法,如下:ByteBuffer buffer = ByteBuffer.allocate(8); int bytesRead = channel.read(buffer);
首先,分配一个Buffer,从FileChannel读取的数据会读到Buffer中。
其次,调用read方法,将数据读进Buffer,方法返回的int说明有多少字节数据写进Buffer了。如果返回-1,说明文件读完了。
向文件通道写数据
通过write方法,如下:RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw"); FileChannel channel = fromFile.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(10); buffer.clear(); buffer.put("Hello".getBytes()); buffer.flip(); while(buffer.hasRemaining()) { channel.write(buffer); } fromFile.close();
注意write方法是在一个循环内被调用,不能保证有多少字节写到文件通道里了,所以我们重复调用write方法直到Buffer没有数据了。
关闭文件通道
channel.close();
文件通道的position
需要对文件通道的特定的位置读写,你可以通过调用position方法获取文件通道当前的位置。你也可以通过调用position(long pos)方法设定文件通道的position。如下:
long pos = channel.position(); channel.position(pos+2);
如果你设置的position在文件末尾之后,从通道读数据会返回-1.
同样如果是写,文件会增大,这可能导致文件空洞,磁盘上的物理文件中写入的数据之间有空隙。
RandomAccessFile fromFile = new RandomAccessFile("e:\\demo.txt", "rw"); FileChannel channel = fromFile.getChannel(); long fileSize = channel.size(); System.out.println("====="+fileSize); long pos = channel.position(); System.out.println("Current Position: " + pos); //重新设定位置 channel.position(pos+3);//形成文件空洞 ByteBuffer buffer = ByteBuffer.allocate(10); buffer.clear(); buffer.put("a".getBytes()); buffer.flip(); while(buffer.hasRemaining()) {//写文件 channel.write(buffer); } buffer.flip(); int bytesRead = channel.read(buffer);//读文件 while(bytesRead!=-1) { buffer.flip(); while(buffer.hasRemaining()) { System.out.print((char)buffer.get()); } System.out.println(); buffer.clear(); bytesRead = channel.read(buffer); } channel.close(); fromFile.close();
这个图片中的20是空格,和上面的00不一样,本人是想试试这个空洞本质上不是空格。
以上展示了文件空洞。
文件通道size
size方法返回FileChannel所关联的文件大小。如下:long fileSize = channel.size();
channel.size和file.length返回的结果是一样的,都是文件的大小,字节数。
文件通道的truncate
截取文件。当你截取文件时,必须指定长度。如下:channel.truncate(10);
如果给定大小小于该文件的当前大小,则截取该文件,丢弃文件新末尾后面的所有字节。如果给定大小大于等于该文件的当前大小,则不修改文件。无论是哪种情况,如果此通道的文件位置大于给定大小,则将位置设置为该大小。
文件通道的force
force方法会将channel里未写入磁盘的数据全部flush到磁盘。操作系统也许为了性能,会缓存数据在内存中,所以不能保证写入channel的数据一定会写到磁盘上,除非你调用forece方法。force方法有一个boolean类型的参数,表示是否将文件元数据(权限等)写到磁盘上。如下:
channel.force(true);
下一节:【JAVA】【NIO】9、Java NIO SocketChannel
相关文章推荐
- java.nio.channels.FileChannel 使用笔记
- 【原创】java NIO FileChannel 学习笔记 FileChannel实现分析 即FileChannelImpl分析
- 08. Java NIO FileChannel 文件通道
- Java - NIO之Channel(FileChannel)
- Java NIO AsynchronousFileChannel
- java nio 之FileChannel
- Java的NIO之FileChannel
- JAVA NIO FileChannel 内存映射文件
- javaNio Filechannel
- Java NIO FileChannel
- Java NIO FileChannel
- Java Nio 八、Java NIO FileChannel
- JavaNio——FileChannel
- Java NIO FileChannel
- 【原创】java NIO FileChannel 学习笔记 新建一个FileChannel
- Java NIO AsynchronousFileChannel
- java NIO系列: Java NIO AsynchronousFileChannel
- JAVA NIO之FileChannel
- FileChannel类的理解和使用(java.nio.channels.FileChannel)
- Java NIO AsynchronousFileChannel