将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream

Posted kakarotto-chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream相关的知识,希望对你有一定的参考价值。

    /** 将 ByteArrayInputStream 拷贝成 ByteArrayOutputStream
     *  将 字节数组输入流 拷贝成 字节数组输出流
     */
    public static ByteArrayOutputStream getByteArrayOutputStream(ByteArrayInputStream inputStream) throws IOException 
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) != -1) 
            outputStream.write(buffer, 0, length);
        
        return outputStream;
    

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.
大意就是 这个值是个估算的值,在读取流的过程中,没有发生阻塞时能够读取到的长度。
所以可以理解为在网络中读取时,可能会发生阻塞的情况。而在本地读取时,则能保证流的不阻塞传输。
建议不使用该办法获取流的字节数组总长度。

以上是关于将字节数组输入流拷贝成字节数组输出流,将ByteArrayInputStream转成ByteArrayOutputStream的主要内容,如果未能解决你的问题,请参考以下文章

IO流系列一:输入输出流的转换

I/O输入输出--其他流

转换流

转换流:InputStreamReaderOutputStreamWriter

java: InputStreamReader将字节的输入流变成字符的输入流,OutputStreamWriter将字符的输出流变成字节的输出流

Java IO流--转换流的使用