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

如何使用NIO将InputStream写入文件?

云捷
2023-03-14
问题内容

我使用下面的方法来写InputStreamFile

private void writeToFile(InputStream stream) throws IOException {
    String filePath = "C:\\Test.jpg";
    FileChannel outChannel = new FileOutputStream(filePath).getChannel();       
    ReadableByteChannel inChannel = Channels.newChannel(stream);
    ByteBuffer buffer = ByteBuffer.allocate(1024);

    while(true) {
        if(inChannel.read(buffer) == -1) {
            break;
        }

        buffer.flip();
        outChannel.write(buffer);
        buffer.clear();
    }

    inChannel.close();
    outChannel.close();
}

我想知道这是否是使用NIO的正确方法。我已经阅读了一个方法FileChannel.transferFrom,该方法带有三个参数:

  1. ReadableByteChannel src
  2. 好仓
  3. 长计

在我的情况下,我只有src,而没有positionand和count,有什么方法可以使用此方法来创建文件?

此外,对于Image,还有什么更好的方法可以仅从InputStream和NIO 创建映像?

任何信息对我来说都是非常有用的。在SO中也有类似的问题,但是我找不到适合我情况的任何特定解决方案。


问题答案:

不,这是不正确的。您冒着丢失数据的风险。规范的NIO复制循环如下:

while (in.read(buffer) >= 0 || buffer.position() > 0)
{
  buffer.flip();
  out.write(buffer);
  buffer.compact();
}

请注意已更改的循环条件,该条件需要在EOS处刷新输出,而使用compact()代替条件clear(),则可以避免发生短写入的情况。

类似地,规范transferTo()/transferFrom()循环如下:

long offset = 0;
long quantum = 1024*1024; // or however much you want to transfer at a time
long count;
while ((count = out.transferFrom(in, offset, quantum)) > 0)
{
    offset += count;
}

它必须在循环中调用,因为不能保证传递整个量子。



 类似资料:
  • 问题内容: 我有一个要写入HttpServletResponse的InputStream。有这种方法,由于使用byte []而需要花费很长时间 我想知道在速度和效率方面,什么是最好的方法? 问题答案: 只需编写块,而不是先将其完全复制到Java内存中即可。下面的基本示例以10KB的块为单位编写。这样,您最终只能获得10KB的一致内存使用量,而不是完整的内容长度。最终用户也将更快地获取部分内容。 作

  • 问题内容: 我需要使用java nio将巨大的字符串写入(附加)到平面文件。编码为ISO-8859-1。 目前,我们正在编写如下图所示。有没有 更好的 方法可以做到这一点? 编辑:尝试了两个选项。以下是结果。 使用ByteBuffer和Channel:花费了4402 ms 使用缓冲的Writer:占用563毫秒 问题答案: 我认为,如果不对软件进行基准测试,您将无法得到严格的答案。在适当的条件下,

  • 问题内容: 如何使用框架有效地从大文件读取并将大数据写入文件。 我工作,并和曾尝试类似如下: 谁能告诉我,如果我的文件大小超过2 GB,我应该遵循相同的步骤吗? 如果大量的书面操作,我想在写作时做类似的事情,该怎么办? 问题答案: 请注意,您可以像示例代码那样简单地用于复制文件,只是速度更快,而且仅一行代码。 否则,如果您已经打开了两个文件通道,则可以使用 将该通道的全部内容传输到该通道。请注意,

  • 输出。 我想写的输出文件与inputfile完全相似,但顺序不是问题。我怎样才能做到,请帮帮我。

  • 我决定使用slf4j而不是Java自己的日志记录。我已经成功地使用SLF4J登录到控制台。但我不知道如何将其写入日志文件。日志文件将帮助我们收集运行时可能出现的错误。 我通过这样做来实现slf4j, 私有静态最终org.slf4j.LOGGER LOGGER=org.slf4j.loggerfactory.getlogger(class1.class); PropertyConfigurator.

  • 问题内容: 我正在制作一个混合移动应用程序,我需要存储一些数据,例如,如果它是一个游戏:高分等..到目前为止,它能够使用jquery从JSON文件中读取数据..,但是是否可以写到JSON文件??! 还是有其他方法可以这样做? IDE-Eclipse(插件-IBM Worklight Studio) 只能使用HTML 5以及JS和JQ! 谢谢 (: 问题答案: 您可以将JSON写入本地存储,而只需使