按底层实现方式划分,Java文件读写有两种:用户空间拷贝 和 内核空间拷贝。
用户空间拷贝
数据传递需要在 用户空间 和 内核空间 之间转换。
java.nio.Files.copy() 几个重载方法内部都是这种方式。
典型用户空间数据拷贝:
void copy(InputStream source, OutputStream target) { byte[] buffer = new byte[8192]; int n; while ((n = source.read(buffer)) > 0) { target.write(buffer, 0, n); } }
内核空间拷贝
数据传递无需经过用户空间转换,直接在内核空间传递。(Linux 和 Unix 系统中所谓的“零拷贝”技术)
这种方式省去了 上下文切换 和 不必要的内存拷贝,性能可以更好。但是必须测试验证,有时候Stream操作反而更快。
java.nio.FileChannel.transferTo() 和 transferFrom() 就是这种方式(《FileChannel 数据传输》)。
commons-io 中 org.apache.commons.io.FileUtils.copyFile() 中就有用到 transferFrom() :
// FILE_COPY_BUFFER_SIZE = 1024 * 1024 * 30 (30MB) private static void doCopyFile(final File srcFile, final File destFile, final boolean preserveFileDate) { ... try (FileInputStream fis = new FileInputStream(srcFile); FileChannel input = fis.getChannel(); FileOutputStream fos = new FileOutputStream(destFile); FileChannel output = fos.getChannel()) { final long size = input.size(); long pos = 0; long count = 0; while (pos < size) { final long remain = size - pos; count = remain > FILE_COPY_BUFFER_SIZE ? FILE_COPY_BUFFER_SIZE : remain; final long bytesCopied = output.transferFrom(input, pos, count); if (bytesCopied == 0) { break; } pos += bytesCopied; } } ... }
注:JDK 11 中 java.io.InputStream 也有个 transferTo() 方法。但这个方法还是典型的用户空间数据拷贝。
相关推荐
基于java的开发源码-FAT文件系统读写类库 fat32-lib.zip 基于java的开发源码-FAT文件系统读写类库 fat32-lib.zip 基于java的开发源码-FAT文件系统读写类库 fat32-lib.zip 基于java的开发源码-FAT文件系统读写类库 ...
有时候需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据。在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有:filp_open() filp_close(), vfs_read() vfs_write(),set_...
java文件读写操作大全java文件读写操作大全java文件读写操作大全java文件读写操作大全java文件读写操作大全
java中用FileUtil实现文件读写
1、 文件读写 包括两个内容:查找文件中“java”字符串的个数;利用命令行参数显示文件的最后指定行。 在查找“java”字符串个数的程序中,先读出文件内容,再逐个字符对比,找出“java”字符,最终把结果写入另一...
dbf-jdbc-wisecoders,JAVA 读写DBF文件工具包
java读写xml文件 java读写xml文件 java读写xml文件 java读写xml文件 java读写xml文件 java读写xml文件
java-poi读.doc和.docx和TXT文件,写.doc和TXT文件。java-poi完美读写word(doc/docx)和TXT。附jar包
android开发实例-sdcard文件读写 WIFI检测、下载文件等 开发环境:JAVA SDK1.7及android最新的开发包
java 二进制文件的读写操作使用FileInputStream FileOutputStream
在linux驱动中如何打开其他设备驱动提供的接口进行读写,此文档详细讲解,我看它才弄出来的。
java 随机读写Java类文件 java 随机读写Java类文件 java 随机读写Java类文件
JAVA读写二进制文件
Java IO基础之读写文本文件
java 文件读写 java 文件读写java 文件读写 java 文件读写java 文件读写 java 文件读写java 文件读写 java 文件读写
JAVA简单的读写文本文件的代码JAVA简单的读写文本文件的代码
Java实现对文件的读写,可设置编码格式
Common通用工具类-JiBX数据编组和解组-物理文件读写等常用函数
Java 读写文件文本文件的示例
这个例子是java采集java S7-S200、java S7-300、java S7-400协义数据, 可以实现数据同步图表显示,并且可以写入数据, 以上全开源,一看就知道,请放心下载,已经使用在生产上 请浏览详情 ...