java – 如何使用NIO将InputStream写入文件?
发布时间:2020-12-14 05:10:53 所属栏目:Java 来源:网络整理
导读:我使用以下方式将InputStream写入文件: private void writeToFile(InputStream stream) throws IOException { String filePath = "C:Test.jpg"; FileChannel outChannel = new FileOutputStream(filePath).getChannel(); ReadableByteChannel inChannel =
我使用以下方式将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的正确方法.我读了一个方法 > 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; } 它必须被循环调用,因为它不能保证传递整个量子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 为什么谷歌会推荐MVP用于MVT?
- Java中使用opencsv读写csv文件示例
- java – 如何使用参数创建GET请求,使用JSF和导航规则?
- Java Socket实现文件传输示例代码
- java – 可以从Fragment类中调用PlaceAutocompleteFragment
- java – Wait.until()与Webdriver PageFactory元素
- java – ExecutorService与休闲主题Spawner
- 多线程 – 调用二进制文件如ls或rm是不是很糟糕的Perl练习?
- Java正则验证电话,手机,邮箱,日期,金额的方法示例
- 阿里出品Excel工具EasyExcel使用小结