当前位置: 首页 > 面试题库 >

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

耿敏达
2023-03-14
问题内容

如何使用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绕行的位置。



 类似资料:
  • 下面是以下代码,它使用BufferedImage读取RGB值,然后简单地将它们再次写回文件。生成的图像是完美的,看起来很好。不用担心。 我运行了一个打印测试,打印出前10个RBG int值。这是为了测试“test.png”文件,然后测试结果图像——“new-test . png”。出于某种原因,我得到了不同的RBG值之间的两个文件。 例如(前3个RGB int值) test.png:-167042

  • null 如果我的理解有误,请指正。还有以下问题: 我的理解是,Hadoop中的文件读/写没有任何并行性,它所能执行的最佳操作与传统的文件读或写(即,如果复制设置为1)+分布式通信机制中涉及的一些开销是一样的。 并行性仅在数据处理阶段通过Map Reduce提供,而不是在客户端读/写文件期间提供。

  • 我们在项目中使用Apache POI(3.9版)来创建PowerPoint (pptx)文件。但是,其中一些变得非常大(2000张幻灯片,每张幻灯片上有许多形状),因此生成会产生< code>GC开销限制超出错误。 堆空间大小不在我们的控制范围内,因为我们只为 RCP“父”应用程序开发一个插件。 有没有办法写(和读)这么大的文件?我们对Excel文档使用了流式API,并取得了巨大的成功,但是没有针

  • 问题内容: 我试图逐行读取文件,然后使用Node.js将其输出到另一个文件。 我的问题是由于Node.js的异步特性,行的顺序有时会混乱。 例如,我的输入文件就像:第1行第2行第3行 但是输出文件可能像:第1行第3行第2行 下面是我的代码。 任何想法将不胜感激,谢谢。 问题答案: 如果要编写同步代码,请仅使用同步功能: 对于异步方法,您可以编写类似

  • 我试图将json对象写入文件/从文件中读取json对象。json结构很复杂,是动态生成的。 对于较小的json对象,我只需将json转换为string,然后进行string写/读操作。当json太大时,这会导致内存不足问题。 如何将JSONObject直接流到文件中,并直接从文件中流回JSONObject?

  • 问题内容: 我在文件中有以下JSON : 如何使用PHP 添加到文件中? 这是我到目前为止的内容: 这给了我一个致命错误:无法在此行上将stdClass类型的对象用作数组: 我正在使用PHP5.2。有什么想法吗?谢谢! 问题答案: 错误消息中的线索是-如果您查看文档以了解它可能需要第二个参数,该参数控制返回数组还是对象-它默认为object。 因此,将您的通话更改为 并且它将返回一个关联数组,您的