`

【Java核心-基础】文件读写的底层数据传输方式 (用户空间 vs 内核空间)

    博客分类:
  • Java
 
阅读更多

按底层实现方式划分,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() 方法。但这个方法还是典型的用户空间数据拷贝。

 

  • 大小: 18.3 KB
  • 大小: 17 KB
分享到:
评论

相关推荐

    基于Java的源码-高性能Java网络框架 MINA.zip

    - **零拷贝(Zero-Copy)**:MINA利用Java NIO的Buffer和FileChannel的直接内存访问,减少了数据在内核空间和用户空间之间的复制,提升了性能。 - **事件驱动模型**:MINA的事件模型减少了线程间的上下文切换,...

    Linux_内核注释 Linux_内核注释

    8. **系统调用**:用户空间程序通过系统调用接口与内核交互,执行如打开文件、读写数据、创建新进程等操作。系统调用是用户程序访问内核服务的唯一途径。 9. **安全性与权限管理**:Linux遵循Unix的安全模型,采用...

    Java Socket源码

    在Java编程中,Socket是网络通信的基础组件,它为两台机器间的应用程序提供了一种建立和维护连接的方式。Socket基于TCP/IP协议,提供了可靠的面向连接的数据传输服务。本篇将深入探讨Java Socket的源码,帮助开发者...

    数据存储之IO

    零拷贝技术,如Linux的sendfile系统调用,可以减少数据在内核空间和用户空间之间的拷贝,提高网络传输效率。 最后,我们不能忽略并发IO处理。在多线程或多进程环境中,正确地同步IO操作至关重要,避免数据竞争和...

    《Android移动应用基础教程》-习题答案.docx编程资料

    - **Linux内核**:作为Android的基础,它提供了硬件驱动和其他核心服务。 - **核心类库**:这部分包括了低级别的C/C++库以及Dalvik虚拟机使用的Java类库。 - **应用程序框架层**:为应用程序提供了一个框架,让...

    Java串口通信程序详解

    3. 校验位:用于检测数据传输中的错误,可以是无校验、奇校验、偶校验、标记校验或空间校验。 4. 停止位:在每个数据帧结束时添加的额外位,常见值为1位或2位。 四、串口通信步骤 1. 打开串口:通过指定端口号和...

    linux和windows下利用RXTX进行java串口开发

    对于更复杂的应用场景,如多线程读写、流式传输等,开发者需要对并发控制和错误处理有深入的理解。此外,RXTX还支持串口中断、DTR/DSR控制线等高级功能,可以根据具体需求进行利用。 总的来说,RXTX为Java开发者...

    Android-SerialPort-Tool-master.rar

    Android-SerialPort-Tool主要利用了Java的JNI(Java Native Interface)技术,通过调用C/C++编写的动态链接库(.so文件)来访问Android系统的底层串口。在JNI中,开发者可以使用`open()`、`write()`、`read()`和`...

    蓝牙源代码

    在Android操作系统中,蓝牙功能的实现是通过其内核层的蓝牙协议栈和用户空间的API接口来完成的。针对你提供的“蓝牙源代码”主题,这里将详细讲解Android 4.0 (Ice Cream Sandwich)中的蓝牙系统架构、关键组件和源...

    操作系统经典算法代码,java编写

    - **TCP/IP模型**:Java实现的套接字编程,包括TCP连接的建立、数据传输和断开。 - **多路复用技术**:如I/O多路复用(select、poll、epoll)的Java实现,用于处理多个套接字连接。 这些Java代码实例为学习者提供...

    Real6410 Android使用手册

    - 在用户空间实现SD卡读写功能。 - **ALSA声卡的支持** - 配置ALSA驱动,支持各种声卡。 - **建立自己的Real6410平台** - 根据Real6410硬件特点,定制Linux内核和Android系统。 - **编译Android for Real6410*...

    REAL210_Android_用户手册_V1.2.pdf

    - **读写速度**: 测试数据传输速率 - **容量兼容性**: 支持多种大小的SD卡 - **错误恢复**: 自动修复文件系统错误 ##### 5.6 U盘测试 - **识别速度**: 快速检测并挂载设备 - **数据传输**: 文件拷贝速度测试 - **...

    okio2.1.0 2.0.0 jar包

    6. **零拷贝(Zero-Copy)**:Okio利用Java NIO的DirectByteBuffer,实现了零拷贝技术,减少了数据在用户空间和内核空间之间不必要的复制,提高了效率。 7. **易用性**:Okio的API设计简洁,学习曲线平缓,对于新手...

    Linux入门到高级

    - `/var`: 存储日志文件、数据库等可变数据。 - `/etc`: 配置文件的存放位置。 - **常用命令**: - `ls`: 列出目录内容。 - `cd`: 改变当前工作目录。 - `mkdir`: 创建目录。 - `rm`: 删除文件或目录。 - `cp`...

    Android操作串口(java与C++混合编程)

    此外,可能还需要实现线程管理,以便在后台进行串口读写,同时提供回调机制将数据传递给Java应用程序。 7. **权限管理**:由于涉及到硬件资源的访问,Android应用需要在AndroidManifest.xml中声明相应的权限,如`...

    android-update刷机包制作教程

    对于Android系统而言,由于其底层基于Linux内核,因此具备一定的Linux基础知识是必要的。这包括对文件系统的理解、基本的命令行操作以及对文件权限的理解。例如,在给定的文件列表中可以看到不同文件的权限设置: -...

    大数据课程体系.docx

    - **Java开发基础知识**:涵盖Java语言的基础语法、变量、数据类型、运算符、流程控制语句(如if语句、for循环等)等内容。 - **Eclipse开发环境**:介绍Eclipse集成开发环境的安装与配置方法,包括如何在Eclipse中...

    java Netty 框架例子源码.rar

    8. **零拷贝**:Netty 实现了零拷贝技术,减少数据在内核和用户空间之间的复制,提高了性能。 9. **多协议支持**:Netty 支持多种网络协议,如 TCP、UDP、HTTP、WebSocket、FTP 等,这使得它在各种场景下都能发挥...

    安卓串口Socket通讯USB驱动jni相关-串口开发的demo里面包含JNI文件.rar

    串行通信是一种通过串行数据线进行数据传输的方式,常见的串口包括RS-232、USB转串口等。在Android设备上,串口通常用于连接各种外设,如传感器、嵌入式设备等,进行数据交换。 JNI在Android串口通信中的作用是桥接...

Global site tag (gtag.js) - Google Analytics