为了账号安全,请及时绑定邮箱和手机立即绑定

IOUtils.toByteArray(inputStream) 方法是否在内部关闭

IOUtils.toByteArray(inputStream) 方法是否在内部关闭

白衣非少年 2022-01-19 09:53:35
这是我的文件内容丢失的代码流,我认为可能是 IOUtils.toByteArray() 行有问题,请在此处指导实际出了什么问题。文件内容丢失:InputStream stream = someClient.downloadApi(fileId);byte[] bytes = IOUtils.toByteArray(stream); String mimeType = CommonUtils.fileTypeFromByteArray(bytes);String fileExtension=FormatToExtensionMapping.getByFormat(mimeType).getExtension();String filePath = configuration.getDownloadFolder() + "/" ;String fileName = UUID.randomUUID() + fileExtension;    File file = new File(filePath+fileName);    file.createNewFile();    FileUtils.copyInputStreamToFile(stream,file);    int length = (int)file.length();现在这里的长度值是0基本上没有内容。让我告诉你,从 downloadApi() 收到的 inputStream 肯定有内容。但是,如果我尝试在代码中进行以下修改,那么我将获得文件的长度。文件内容不会丢失:InputStream stream = someClient.downloadApi(fileId);byte[] bytes = IOUtils.toByteArray(stream);String mimeType = CommonUtils.fileTypeFromByteArray(bytes);String fileExtension=FormatToExtensionMapping.getByFormat(mimeType).getExtension();String filePath = configuration.getDownloadFolder() + "/" ;String fileName = UUID.randomUUID() + fileExtension;stream = new ByteArrayInputStream(bytes); //Again converted bytes to stream    File file = new File(filePath+fileName);    file.createNewFile();    FileUtils.copyInputStreamToFile(stream,file);    int length = (int)file.length();现在我在这里获取文件内容。有人能说出第一个代码片段在技术上的问题吗?
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

不,它没有。


您的代码的第一个版本(在下面复制了一些添加的评论)失败,因为您正在从已经位于流位置末尾的流中读取。


InputStream stream = someClient.downloadApi(fileId);


// This reads the entire stream to the end of stream.

byte[] bytes = IOUtils.toByteArray(stream);


String mimeType = CommonUtils.fileTypeFromByteArray(bytes);

String fileExtension = 

        FormatToExtensionMapping.getByFormat(mimeType).getExtension();

String filePath = configuration.getDownloadFolder() + "/" ;

String fileName = UUID.randomUUID() + fileExtension;    

File file = new File(filePath+fileName);    

file.createNewFile();    


// Now you attempt to read more data from the stream.

FileUtils.copyInputStreamToFile(stream,file);    


int length = (int)file.length();

当您尝试从位于流末尾的流中复制时,您会得到......零字节。这意味着你得到一个空的输出文件。


查看完整回答
反对 回复 2022-01-19
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

不,这个流应该关闭。


这是IOUtils的目标方法:


public static long copyLarge(final InputStream input, final OutputStream output, final byte[] buffer)

        throws IOException {

    long count = 0;

    int n;

    while (EOF != (n = input.read(buffer))) {

        output.write(buffer, 0, n);

        count += n;

    }

    return count;

}


// create stream and use it

InputStream stream = someClient.downloadApi(fileId);

byte[] bytes = IOUtils.toByteArray(stream); 


// then us it again

FileUtils.copyInputStreamToFile(stream,file);


// FIXED VERSION

FileUtils.copyInputStreamToFile(new ByteArrayInputStream(bytes),file);


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 1068 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号