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

前端之家收集整理的这篇文章主要介绍了java – 如何使用NIO将InputStream写入文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用以下方式将InputStream写入文件
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,它有三个参数:

> ReadableByteChannel src
>长仓
>长计数

在我的情况下,我只有src,我没有位置和数量,有什么办法可以使用这种方法来创建文件

还有对于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;
}

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

原文链接:https://www.f2er.com/java/123231.html

猜你在找的Java相关文章