Java中文件读写,我们如果是从J2SE学起的都晓得InputStream,OutputStream流式读写,以及随机读写RandomAccessFile。但是从Java1.4后新增了Java NIO包,里面包含了
一个平时我们不太用的类ByteBuffer字节缓冲区来进行文件读写,说到字节缓冲区它又分为两种方式,一种是非直接缓冲区读写,另一种是直接缓冲区读写,还有一种MappedByteBuffer内存映射方式进行读写。
现在我们来说说这几种的区别:
1.InputStream流式文件读写,实际上是调用操作系统的read()和write()来完成文件的读写,并非直接对文件操作。
2.随机读写实际上是继承了DataInputStream流,它可以对java基础类型进行操作、而且是即可读取、也可以写入,这里的随机并不是不可控制、不可预测的去访问文件、而是可以通过指针的形式定位到具体的位置——“文件指针”、具体使用“文件指针”的方法:调用此流的seek(long n)方法来设置位置。
3.非直接缓冲区:使用缓冲区来进行文件读写实际上是减少了系统调用次数,可以预读更多的字节到自己维护的字节缓冲区中。
4.直接缓冲区:又称为堆外内存,属于Native堆,不属于JVM堆,是由C语言中的malloc()分配的内存。所以在某些场景中可以提高性能。当然每一次Full GC时,它的内存也会被JVM回收。
5.内存映射:它也属于堆外内存并且是直接缓冲区的一种,但是它相比于DirectMemory来说,它是由Java进程直接建立起来的某一段虚拟地址空间和文件对象的关联映射关系。所以内存映射文件的区域并不在JVM GC的回收范围内,因为它本身就不属于堆区,Java中使用((DirectBuffer)byteBuffer).cleaner().clean()来回收。
以下写出后四种的例子:
6.比较下DirectBuffer和MappedByteBuffer:
前者的文件复制原理是:
FileChannel inChannel = new FileInputStream(srcFile).getChannel();
FileChannel outChannel = new FileOutputStream(dstFile).getChannel();
//接下来就是开辟一段操作系统内存ByteBuffer,然后inChannel.read(byteBuffer);
outChannel.write(byteBuffer);//写入通道最终写入磁盘
然而内存映射就省去了操作系统内存缓冲这样的操作,而是将目地物理存储直接作为虚拟内存
那么也就是将outChannel.map(MapMode.READ_WRITE,position,copyFileSize);这段意思就是将输出通道直接作为一段虚拟内存了,那么也就是只需要让
inChannel.read(mappedByteBuffer);也就是只需要让源文件读到虚拟内存中,实际上也就是直接的写入到了目地物理存储了。
7.什么是Buffer:
首先,buffer就是我们常说的块,而它本质上就是一个字节数组,相比于流式一个字节一个字节的读写,块读写减少了读写次数。
下面我需要再介绍一种多线程随机读写,当然对于熟悉多线程的Coder来说太简单不过了。
这里再解释一遍,我们使用的实现Runnable方式来实现多线程,而不是继承Thread,其原因就是使用前者可以使线程间共享内存变量。
到此这篇ifstream读取一行数据(ifstream.read())的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/37674.html