zoukankan      html  css  js  c++  java
  • IO流系列一:输入输出流的转换

    输入流转字节数组的原理
    1、读取输入流,每一小段 读一次,取出 byteArray 。
    2、将该一小段byteArray写入到字节输出流ByteOutStream。直到不能从输入流再读出字节为止。
    3、将字节输出流转成字节数组。

    源码:

    public class ByteToInputStream {  
      
        public static final InputStream byte2Input(byte[] buf) {  
            return new ByteArrayInputStream(buf);  
        }  
      
        public static final byte[] input2byte(InputStream inStream)  
                throws IOException {  
            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();  
            byte[] buff = new byte[100];  
            int rc = 0;  
            while ((rc = inStream.read(buff, 0, 100)) > 0) {  
                swapStream.write(buff, 0, rc);  
            }  
            byte[] in2b = swapStream.toByteArray();  
            return in2b;  
        }  
      
    }

    疑问1:为什么输入流,需要一小段一小段地读,而不是整段读取?
    分析:如果需要整段读取,则需要取输入流的available(),但是该方法不能正确地返回输入流的总长度。

    疑问2:为什么输入流的available()不能返回总长度?
    分析:查看available方法的源码。返回值 描述是下面这个玩意,
    * @return     an estimate of the number of bytes that can be read (or skipped
    * over) from this input stream without blocking or {@code 0} when
    * it reaches the end of the input stream.
    大意就是 这个值是个估算的值,在读取流的过程中,没有发生阻塞时能够读取到的长度。
    所以可以理解为在网络中读取时,可能会发生阻塞的情况。而在本地读取时,则能保证流的不阻塞传输。
    建议不使用该办法获取流的字节数组总长度。
  • 相关阅读:
    IDL变量和数组使用
    IDL程序部署
    silverlight连接数据库的四种方法
    ENVI 5.0安装教程
    ArcGIS Server发布地图时提示打包失败解决方法
    ArcGIS Server服务未发布成功,怎么删除?
    Win8磁盘100% Win8磁盘占用100%解决办法终结版(3)
    攻防世界 reverse 进阶 -gametime
    攻防世界 reverse 进阶 16-zorropub
    攻防世界 reverse 进阶 15-Reversing-x64Elf-100
  • 原文地址:https://www.cnblogs.com/chenjfblog/p/8915679.html
Copyright © 2011-2022 走看看