在存储空间中有这样一个图片,下载我使用代码来下载它
在这里插入图片描述

来看代码


   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();

在这里插入图片描述
这次旧正常了

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐