为什么ByteArrayOutputStream和ByteArrayInputStream不是相同的内容



我在Java的一个单元测试中遇到了一个大问题。我将字节数组与InputStream进行比较,但没有得到相同的结果。

示例如下:

public final class ByteGetInputStreamExampleProblem
{
    public static void main( final String[] args ) throws Exception
    {
        final SecureRandom s = new SecureRandom() ;
        final ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
        long bPut = 0 ;
        final byte[] buffer = new byte[ 2 ] ;
        while( bPut < 10 )
        {
            s.nextBytes( buffer ) ;
            bos.write( buffer ) ;
            bPut += buffer.length ;
        }
        final InputStream is = new ByteArrayInputStream( bos.toByteArray() ) ;
        System.out.print("A = ");
        for( int i = 0 ; i < bos.size() ; i++ )
            System.out.print( bos.toByteArray()[i] + ";" ) ;
        System.out.print("nB = ");
        int c ;
        while( ( c = is.read() ) != -1 )
            System.out.print(c + ":");
    } ;
} ;

输出:

A = -3;-47;-121;37;-73;83;109;-54;

B = 253:209:135:37:183:83:109:202:20:106:

当您打印A的内容时,您将它们以字节形式打印。因此,它将打印从Byte.MIN_VALUEByte.MAX_VALUE (-128127)之间的值。

当您使用is.read()时,您读取的内容是作为int传递给您的无符号数。该值介于0255之间。

您可以通过将c转换为字节来获得相同的输出,例如

while( ( c = is.read() ) != -1 ){
    byte b = (byte)c;
    System.out.print(b + ":");
}

本质上,您需要将两个数字转换为0255之间或-128127之间。

您可以通过将0255的范围转换为-128127的范围,将其转换为一个字节。

您可以通过执行value & 0xFF-128转换为127。这将使其在0 - 255范围内。

ByteArrayInputStreamread()的代码如下:

public synchronized int read() {
    return (pos < count) ? (buf[pos++] & 0xff) : -1;
}

相关内容

  • 没有找到相关文章

最新更新