文件通道

通道是访问I/O服务的导管,I/O可以分为广义的两大类:File I/O和Stream I/O。那么相应的,通道也有两种类型,它们是文件(File)通道和套接字(Socket)通道。文件通道指的是FileChannel,套接字通道则有三个,分别是SocketChannel、ServerSocketChannel和DatagramChannel

通道可以有多种方式创建。Socket通道有直接创建Socket通道的工厂方法(open()方法)。一个FileChannel对象却只能通过在一个打开的RandomAccessFile、FileInputStream或FileOutputStream对象上调用getChannel()方法来获取,开发者不能直接创建一个FileChannel

文件通道总是阻塞的,不能置于非阻塞模式下

FileChannel对象是线程安全的。多个进程可以在同一个实例上并发调用方法而不会引起任何问题,不过并非所有的操作都是多线程的。影响通道位置或者影响文件的操作都是单线程的,如果有一个线程已经在执行会影响通道位置或文件大小的操作,那么其他尝试进行此类操作之一的线程必须等待,并发行为也会受到底层操作系统或文件系统的影响。

打开FileChannel

RandomAccessFile aFile = new RandomAccessFile("data.txt", "rw");

FileChannel fileChannel= aFile.getChannel();

从FileChannel读取数据

ByteBuffer buf = ByteBuffer.allocate(100);

int bytr = fileChannel.read(buf);

注意: read()方法返回的int值表示读取了多少字节数到Buffer中,如果为-1,则表示到了文件末尾

向FileChannel中写入数据

1 String str = "some thing";2 ByteBuffer buf = ByteBuffer.allocate(100);3 buf.clear();4 buf.put(str.getBytes());5 buf.flip();6 while(buf.hasRemaining()){7 fileChannel.write(buf);8 }

9 fileChannel.close();

注意: write()方法是在while循环里的。因为无法保证write()一次能写入多少字节,因此需要重复调用,知道Buffer中没有尚未写入到Channel中的数据

关闭FileChannel

fileChannel.close();

position()方法

有时可能需要在FileChannel中某个特定位置进行数据的读写操作,可以通过position()方法获取FileChannel的当前位置,也可以通过position(long newPosition)设置FileChannel的位置

long position =channel.position();

channel.position(position+10);

注意: 如果将位置设置到文件结束符之后,然后读取字节将返回-1,写入字节,文件将扩大到当前位置,并将数据写入通道。这可能导致“文件空洞”,磁盘上物理文件中写入的数据间有空隙

size()方法

long size = fileChannel.size();

返回实例所关联的文件大小

truncate()方法

fileChannel.truncate(1024);

该方法截取一个文件,截取文件时,文件中指定部分后面的数据将被删除,上面的例子表示截取文件前1024个字节

force()方法

fileChannel.force(true);

该方法将通道里尚未写入到磁盘的数据强制写入到磁盘上。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。要保证这一点,需要调用force()方法。

force()方法有一个boolean类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。

java 文件通道_Java NIO(四)文件通道相关推荐

  1. java用NIO实现文件传输_Java Nio 实现文件的传输

    使用Java Nio实现文件的传输 1.ServerSocket.java package ch2; import java.io.File; import java.io.FileNotFoundE ...

  2. java搭云梯_java nio为什么是通道(一):通往nio的云梯

    java nio的通道是一个全新的I/O实现,没有扩展或者继承其它的类或者包. 通过只能在字节缓冲区上操作,因此Channel是面向字节的接口,为什么要这样设计呢?主要是因为通道直接会和操作系统的I/ ...

  3. java bytebuffer 读写_java nio bytebuffer文件读写问题

    为什么下面的代码从文件中读不出3和2来?importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOExc ...

  4. java nio 追加写文件_Java NIO写入文件

    用NIO写文件,总结一下,主要有如下步骤: 1.打开通道. 2.包装到缓冲区. 3.写入文件. 4.不忘记关闭通道,关闭流.package what21.nio; import java.io.Fil ...

  5. java中io与nio复制文件性能对比

    2019独角兽企业重金招聘Python工程师标准>>> 1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read( ...

  6. java 读取大文件内容_java读取大文件

    java一般读取文件时,将文件文内容全部加在到内存,然后读取,但是这种读取方式很明显不适合读取大文件,在进行大文件处理时,考虑到内存有限,采用分次读取的方式. java分次读取文件内容有三种方式, 1 ...

  7. java 获取当前目录_java获得当前文件路径

    第一种: File f = new File(this.getClass().getResource("/").getPath()); System.out.println(f); ...

  8. java获取文件编码_java如何获取文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

  9. java多线程 文件夹_Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合

    复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...

最新文章

  1. Codeforces Global Round 4 题解
  2. cad2014卡顿的解决方法_升级iOS14.1后出现卡顿、闪退?这3种方法可以解决
  3. Vue项目中使用svg文件
  4. 示例:工具提示对象---享元模式应用
  5. android杀掉进程顺序
  6. 热血江湖战无止境与服务器连接不稳定,《热血江湖》V14.0“战无止境”新版玩不停...
  7. LeetCode 962. 最大宽度坡(单调栈)
  8. mysql数据库(9):常用查询的例子
  9. apache启动错误 AH00072: make_sock: could not bind to address [::]:443
  10. Kruskal/prim--最小生成树
  11. SSD硬盘的几个常见概念SATA、PCIE、M.2、AHCI、NVME总结
  12. mysql怎么用迅雷下载_MySQL安装详细步骤(附迅雷下载链接)
  13. 易语言窗口c_句柄取进程名,易语言进程id取窗口句柄
  14. 基于C#语言Windows窗体应用(.Net Framework)的教室点名系统V1.0
  15. 快速批量重命名文件(夹)
  16. CodeForces - 1299B. Aerodynamic
  17. linux上安装NVIDIA显卡驱动以及深度学习需要的cudn、cudnn、pytorch
  18. 框架使用 - 收藏集 - 掘金
  19. python itchat教程_Python学习教程:教你用Python通过微信来控制电脑摄像头
  20. 【使用 BERT 的问答系统】第 1 章 : 自然语言处理简介

热门文章

  1. 20140625 程序 进程 线程 物理存储器
  2. zencart 如何修改在线人数和订单编号
  3. 定制自己的Windows CE 5.0 ARM中文模拟器(转)
  4. 4.2路由算法与路由协议概述
  5. 操作系统学习笔记-02-1.2-什么是操作系统
  6. linux基础知识——僵尸进城和孤儿进程
  7. python实现邮件客户端_利用python实现简单的邮件发送客户端示例
  8. github注册账号一直验证失败
  9. OpenCV学习(二十二) :反向投影:calcBackProject(),mixChannels()
  10. python学习---常见的内置字符串(二)