zoukankan      html  css  js  c++  java
  • InputStream类available和read方法读取流数据不全?

    1.问题描述

    需要将流InputStream转换为byte[]数组,定义的方法如下:

        /**
         * 流转字节数组
         *
         * @param in
         * @return
         * @throws IOException
         */
        public static byte[] streamToByteArray(InputStream in) throws IOException {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[(int) in.available()];
            in.read(buffer);
            in.close();
            return buffer;
        }

    在对文件进行转换并保存到本地时,发现文件不完整或内容错误。

    2.原因分析

    从代码中可以看出,在读物流时调用的是available方法,点击进入其源码发现其返回的是当前流可用长度(估计值),不是流的总长度。而在read方法读取流中数据到buffer中,但读取长度为1至buffer.length,若流结束或遇到异常则返回-1。也就是说当实际文件的长度超过此估计可用长度时也不会继续读,而是结束读取。从而导致读取的流并不完整。

    3.解决方案

    不能使用available方法,那就需要循环去读取流,直到读取完成,修改的代码如下:

        public static byte[] streamToByteArray(InputStream in) throws IOException {
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            byte[] buffer = new byte[4096];
            int n;
            while (-1 != (n = in.read(buffer))) {
                output.write(buffer, 0, n);
            }
            return output.toByteArray();
        }

    有时也不能只使用系统自动的方法,容易掉坑。

    就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
  • 相关阅读:
    AOP从静态代理到动态代理 Emit实现
    云计算仿真工具CloudSim介绍和使用
    SSH框架中配置log4j的方法
    SSH常见面试题
    第一章
    shell 生成目录的树状视图、生成文件及子目录的汇总信息
    shell拼写检查,利用Linux字典
    SHELL:多文件的重命名和移动
    sort
    tr1
  • 原文地址:https://www.cnblogs.com/zys2019/p/15675046.html
Copyright © 2011-2022 走看看