013自己造的bug之阿里云OOS下载文件损坏
在存储空间中有这样一个图片,下载我使用代码来下载它来看代码public static void main(String[] args) throws IOException {// EndpointString endpoint = "https://oss-cn-beijing.aliyuncs.com";// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使
·
在存储空间中有这样一个图片,下载我使用代码来下载它
来看代码
public static void main(String[] args) throws IOException {
// Endpoint
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
String accessKeyId = "xxxxxxxxxxxxxxxx";
String accessKeySecret = "xxxxxxxxxxxxxxxxxxxxx";
//001 下载前 指定 ******存储空间中的文件名称
// <yourObjectName>下载文件时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
String objectName = "aaa/bbb/pic.jpg";
//002 指定要下载到哪一个饭桶
String bucketName = "oostest1";
//003 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//004 通过客户端获取对象元 含文件内容及文件元信息
OSSObject object = ossClient.getObject(bucketName, objectName);
//005 通过对象元获取输入流读到本地内存中
InputStream objectisContent = object.getObjectContent();
//05.1 关联本地文件
String path = Test4.class.getClassLoader().getResource("").getPath();
File file = new File(path, "/download/download4.jpg");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
//006保存到本地 基操
int len;
byte[] bytes=new byte[1024];
while ((len=objectisContent.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,len);
}
//007关闭对象流
objectisContent.close();
//008 关闭OSSClient。
ossClient.shutdown();
}
来看下载的图片
测试了下载三张图片,发现下面根出现了灵异时间一样
原因分析
肯定是输入输出流没有弄好,但这又不是整个图片不能看,所以应该是最后细节没有处理好,与流相关的代码从第六步开始,我们发现网络流关闭了(007) 客户端关闭了(008)但是保存到本地所用到的本地输出流没有关闭,而其是字节缓存输出流。我猜想,当缓冲流读到-1时,首先将有效数据写入,跳出循环后,整个程序要关闭,它旧把垃圾数据也写入了文件中去了。
//006保存到本地 基操
int len;
byte[] bytes=new byte[1024];
while ((len=objectisContent.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,len);
}
//007关闭对象流
objectisContent.close();
//008 关闭OSSClient。
ossClient.shutdown();
修正后
//006保存到本地 基操
int len;
byte[] bytes=new byte[1024];
while ((len=objectisContent.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,len);
}
//0066一定要关闭本地流
bufferedOutputStream.close();
//007关闭对象流
objectisContent.close();
//008 关闭OSSClient。
ossClient.shutdown();
这次旧正常了
更多推荐
所有评论(0)