gpt4 book ai didi

java - 使用Java NIO读写大文件

转载 作者:行者123 更新时间:2023-12-02 03:10:30 25 4
gpt4 key购买 nike

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

我正在使用 ByteBufferFileChannel 并尝试过如下所示的操作:

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)像示例代码一样复制文件,可能更快并且只需要一行代码。

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

它们一起允许以有效的方式进行几乎所有可以想象的重要批量传输,而无需将数据复制到 Java 端缓冲区中。如果这不能解决您的需求,您必须更具体地提出您的问题。

顺便说一下,您可以open a FileChannel directly自 Java 7 以来,无需绕行 FileInputStream/FileOutputStream

关于java - 使用Java NIO读写大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41115869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com