使用Java NIO读取和写入大文件

凯威

如何使用Java NIO框架有效地从大文件读取并将大数据写入文件

我正在与ByteBuffer并且FileChannel尝试过类似以下的内容:

public static void main(String[] args) 
{
    String inFileStr = "screen.png";
    String outFileStr = "screen-out.png";
    long startTime, elapsedTime; 
    int bufferSizeKB = 4;
    int bufferSize = bufferSizeKB * 1024;

    // Check file length
    File fileIn = new File(inFileStr);
    System.out.println("File size is " + fileIn.length() + " bytes");
    System.out.println("Buffer size is " + bufferSizeKB + " KB");
    System.out.println("Using FileChannel with an indirect ByteBuffer of " + bufferSizeKB + " KB");

    try (   FileChannel in = new FileInputStream(inFileStr).getChannel();
            FileChannel out = new FileOutputStream(outFileStr).getChannel() ) 
    {
        // Allocate an indirect ByteBuffer
        ByteBuffer bytebuf = ByteBuffer.allocate(bufferSize);

        startTime = System.nanoTime();

        int bytesCount = 0;
        // Read data from file into ByteBuffer
        while ((bytesCount = in.read(bytebuf)) > 0) { 
            // flip the buffer which set the limit to current position, and position to 0.
            bytebuf.flip();
            out.write(bytebuf); // Write data from ByteBuffer to file
            bytebuf.clear(); // For the next read
        }

        elapsedTime = System.nanoTime() - startTime;
        System.out.println("Elapsed Time is " + (elapsedTime / 1000000.0) + " msec");
    } 
    catch (IOException ex) {
        ex.printStackTrace();
    }
}

谁能告诉我,如果我的文件大小超过2 GB,我应该遵循相同的步骤吗?

如果大量的书面操作,我想在写作时做类似的事情,该怎么办?

霍尔格

请注意,您可以Files.copy(Paths.get(inFileStr),Paths.get(outFileStr), StandardCopyOption.REPLACE_EXISTING)像示例代码那样简单地用于复制文件,只是速度更快并且仅一行代码即可。

否则,如果您已经打开了两个文件通道,则可以使用
in.transferTo(0, in.size(), out)将该in通道的全部内容传输到该out通道。请注意,此方法允许在源文件中指定一个范围,该范围将被传输到目标通道的当前位置(最初为零),并且还有一种相反的方法,即out.transferFrom(in, 0, in.size())从源通道的当前位置传输数据到目标文件中的绝对范围。

它们在一起,可以有效地进行几乎所有可以想象到的简单的批量传输,而无需将数据复制到Java侧缓冲区中。如果那不能解决您的需求,则您必须更具体地回答您的问题。

顺便说一句,从Java 7开始,您可以直接打开一个FileChannel不带FileInputStream/FileOutputStream绕行的位置。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Python从1个进程使用HDF5和MPI写入/读取大文件

来自分类Dev

使用Python从1个进程使用HDF5和MPI写入/读取大文件

来自分类Dev

使用Java读取真正的大文件

来自分类Dev

使用单独的线程在Java中读取和写入文件

来自分类Dev

如何使用缓冲读取器和缓冲写入器在Java中读取和写入文件

来自分类Dev

使用Java NIO文件走读取文件()

来自分类Dev

Python:减少大文件读取-存储-操作-写入程序中的RAM使用量

来自分类Dev

使用cordova文件插件写入和读取文件

来自分类Dev

使用 Python 和 Javascript 从 Json 文件中读取和写入

来自分类Dev

如何在C ++中使用混合文本和二进制文件读取大文件

来自分类Dev

Java-从文本文件读取和写入

来自分类Dev

写入和读取Java二进制文件

来自分类Dev

使用cmd在任务完成之前读取和写入文件

来自分类Dev

使用读取和写入流保存文件时图像损坏

来自分类Dev

如何使用WinAPI向文件写入和读取数组?

来自分类Dev

如何使用C#同时读取和写入文件

来自分类Dev

如何使用 QDataStream 在文件中写入和读取 QList<Mat>?

来自分类Dev

如何使用 PrintStream 类读取和写入文件?

来自分类Dev

读取大文件错误“ outofmemoryerror”(java)

来自分类Dev

读取大文件(Java堆空间)

来自分类Dev

使用apache common io读取大文件

来自分类Dev

使用Akka Streams读取大文件

来自分类Dev

使用PowerShell读取大文件并删除回车

来自分类Dev

使用apache common io读取大文件

来自分类Dev

Node.js 使用 find 和 head 读取大文件目录

来自分类Dev

Java读取文件并写入数组

来自分类Dev

使用并发(akka)异步API(nio2)进行Scala,读取文件,处理行并将输出写入新文件

来自分类Dev

Java项目使用读取文件,写入文件和数组

来自分类Dev

使用Shell和Java读取和写入串行端口

Related 相关文章

  1. 1

    使用Python从1个进程使用HDF5和MPI写入/读取大文件

  2. 2

    使用Python从1个进程使用HDF5和MPI写入/读取大文件

  3. 3

    使用Java读取真正的大文件

  4. 4

    使用单独的线程在Java中读取和写入文件

  5. 5

    如何使用缓冲读取器和缓冲写入器在Java中读取和写入文件

  6. 6

    使用Java NIO文件走读取文件()

  7. 7

    Python:减少大文件读取-存储-操作-写入程序中的RAM使用量

  8. 8

    使用cordova文件插件写入和读取文件

  9. 9

    使用 Python 和 Javascript 从 Json 文件中读取和写入

  10. 10

    如何在C ++中使用混合文本和二进制文件读取大文件

  11. 11

    Java-从文本文件读取和写入

  12. 12

    写入和读取Java二进制文件

  13. 13

    使用cmd在任务完成之前读取和写入文件

  14. 14

    使用读取和写入流保存文件时图像损坏

  15. 15

    如何使用WinAPI向文件写入和读取数组?

  16. 16

    如何使用C#同时读取和写入文件

  17. 17

    如何使用 QDataStream 在文件中写入和读取 QList<Mat>?

  18. 18

    如何使用 PrintStream 类读取和写入文件?

  19. 19

    读取大文件错误“ outofmemoryerror”(java)

  20. 20

    读取大文件(Java堆空间)

  21. 21

    使用apache common io读取大文件

  22. 22

    使用Akka Streams读取大文件

  23. 23

    使用PowerShell读取大文件并删除回车

  24. 24

    使用apache common io读取大文件

  25. 25

    Node.js 使用 find 和 head 读取大文件目录

  26. 26

    Java读取文件并写入数组

  27. 27

    使用并发(akka)异步API(nio2)进行Scala,读取文件,处理行并将输出写入新文件

  28. 28

    Java项目使用读取文件,写入文件和数组

  29. 29

    使用Shell和Java读取和写入串行端口

热门标签

归档