java 文件通道_Java NIO(四)文件通道

文件通道

通道是访问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类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA入门级教学之(continue)

/* continue语句: 1.continue表示:继续/下一个的意思 2.continue;也是一个continue关键字加一个分号构成一个单独的完整的java语句, 主要出现循环语句中用来控制循环的执行。 …

java算法实验标尺问题_在codeigniter项目中使用标尺库

我正在尝试将下面链接中可用的标尺库集成到我的codeigniter项目中 .我使用这些链接中给出的步骤安装和配置它 . 但仍然无法使用库中的方法 . 我尝试了库中的示例代码,但它不起作用 . 看起来Ruler库没有得到我的项目,因此方法没有解决 . 寻求帮助以实现这…

JAVA入门级教学之(方法-1)

目录 JAVA入门级教学之(方法-1) 1.以下程序不使用"方法",分析一下程序会存在哪些优缺点? 2.方法的本质:是一段代码片段,可以完成特定功能,可以重复利用 3.注意:方法定义在…

java设计模式初探之装饰者_JAVA设计模式初探之装饰者模式

装饰者模式1、意图: 动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。该模式以对客 户端透明的方式扩展对象的功能。2、适用环境(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责…

JAVA入门级教学之(方法-2)

/* 关于方法调用 -1.方法的修饰符列表中有static关键字,完整的调用方法是:类名.方法名(实参列表); -2.对于方法的修饰符列表中有static关键字的,"类名."可以省略不写 -3.对于在类外的方法调用,就必须使…

JAVA入门级教学之(方法-题-3)

/*分析以下程序的输出结果: *方法体内自上而下执行 *main方法开始main 方法结束*/public class method03 {public static void main(String[] args){System.out.println("main begin");m1();System.out.println("main over");}public static vo…

redis在java中的方法_redis在java中的使用方法

Redis是key-value方式储存数据的内存数据库。下载后解压,redis-server.exe是redis服务,启动之后就可以使用redis。redis-cli.exe是客户端,可以访问本地或远程的redis。redis-cli.exe -h 127.0.0.1 -p 6379 命令行命令。修改-h后的ip…

JAVA入门级教学之(方法-4)

/* 方法的返回值类型不是void的时候 1.要求方法必须保证百分百的执行"return 值;"这样的语句来完成值的返回 *没有这个语句编译器会报错 2.一个方法有返回值的时候,当我们调用这个方法的时候,方法返回了一个值&…

Java写一个快速排序_快速排序java实现

1.快速排序的思想快速排序属于交换排序,是冒泡排序的升降版。相对于冒泡排序而言,快速排序增大了记录比较和移动的距离,将关键字较大的记录直接移动到后面,将关键字较小的记录直接移动到前面;不再是相邻两个记录依次进…

JAVA入门级教学之(方法-调用-5)

/* 方法调用的时候实参和形参要求个数对应相同,数据类型对应相同 -类型不同的时候要求能够进行相应的自动类型转换 */ public class method05 {public static void main(String[] args){//编译错误,参数数量不对//method05.sum();//编译报…

JAVA实现命令助手_samples/简单语音编程,将手机打造成智能助手.md · javalovercn/HomeCenter - Gitee.com...

## 开发 语音小助手让我们用不到50行代码来开发一个跨平台语音生活助手(可运行于iPhone和Android),它会回答以下类似问题:1. “讲个笑话”,2. “什么是月季”,3. “今天北京到上海的火车”,4. “明天农历”&#xff0c…

JAVA入门级教学之(方法-6)

/* 深入return语句 *带有return关键字的java语句只要执行,所在的方法执行结束。 *在"同一个作用域"中,return语句下面不能编写任何代码,因为 这些代码永远执行不到。所以编译报错 */ public class method06…

java porm.xml_通过Maven仓库安装Spire.PDF for Java

本文将介绍如何通过Maven仓库安装Spire.PDF for Java。首先,在pom.xml文件中配置Maven仓库路径。com.e-icebluee-icebluehttp://repo.e-iceblue.com/nexus/content/groups/public/其次,在pom.xml文件中指定Spire.PDF for Java的Maven依赖e-iceblue spire…

JAVA入门级教学之(方法-7)

/* 在返回值类型是void的方法中使用"return;"语句 "return;"语句出现在返回值为void的方法中主要是为了用来结束当前方法 break;语句主要是跳出整个循环 */ public class method07 {public static void main(String[] args){m();}//编译报错…

java中大数字表示什么_JAVA中大数字的的处理:BigInteger和BigDecimal

关键技术剖析: BigInteger:支持任意精度的整数,可以精确地表示任意大小的整数值,同时在运算过程中不会丢失任何信息。 BigDecimal:可以精确地表示任意精度的小数,同时在运算过程中不会丢失任何信息。源码&a…

JAVA入门级教学之(方法内存分配机制)

目录 JAVA入门级教学之(方法内存分配机制) 1.方法只定义,不调用,是不会执行的 2.在JVM内存划分上有这样三块主要的内存空间:【还有其它的内存空间】 3.关于"栈"数据结构 4.方法代码片段存在哪里?…

it跟java的区别_详细介绍JAVA和C++区别

JAVA和C都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继乘,多态)。而由于c为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!JAVA则…

JAVA入门级教学之(方法递归)

目录 JAVA入门级教学之(方法递归) 1.关于方法的递归调用: 2.递归是很耗费栈内存的,递归算法可以不用的时候尽量别用 3.以下程序运行的时候发生了这样的一个错误【不是异常,是错误】 4.递归必须有结束条件,没…

java dom cdata_java – 通过DOM解析器从XML处理CDATA

我以前从未处理过XML,所以我不确定如何在XML文件中处理CDATA.我迷失在节点,父节点,子节点,nList等中.谁能告诉我这些代码片段的问题是什么?我的getTagValue()方法适用于除“详细信息”之外的所有标记,“详细信息”是包含CDATA的标记......NodeList nList doc.getEl…

JAVA入门级教学之(方法递归习题)

/*不使用递归&#xff0c;计算1-N的和使用递归&#xff0c;计算1-N的和 */public class recursion02 {public static void main(String[] args){ //方法1 计算1-4的和//缺点&#xff0c;固定只能计算单独的一次int n4;int sum0;for(int i1;i<4;i){sumi;}System.out.print…