Java 为什么ByteArrayOutputStream和ByteArrayOutputStream的内容不一样?

Java 为什么ByteArrayOutputStream和ByteArrayOutputStream的内容不一样?,java,arrays,byte,inputstream,bytearrayoutputstream,Java,Arrays,Byte,Inputstream,Bytearrayoutputstream,我在Java的一个单元测试中遇到了一个大问题。我将字节数组与InputStream进行比较,得到的结果不同 下面是一个例子 public final class ByteGetInputStreamExampleProblem { public static void main( final String[] args ) throws Exception { final SecureRandom s = new SecureRandom() ;

我在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 + ":");
    } ;
} ;
公共最终类ByteGetInputStreamExampleProblem
{
公共静态void main(最终字符串[]args)引发异常
{
最终SecureRandom s=新SecureRandom();
final ByteArrayOutputStream bos=新建ByteArrayOutputStream();
长bPut=0;
最终字节[]缓冲区=新字节[2];
而(bPut<10)
{
s、 下字节(缓冲区);
写入(缓冲区);
bPut+=缓冲区长度;
}
最终输入流是=newbytearrayinputstream(bos.toByteArray());
系统输出打印(“A=”);
对于(int i=0;i

输出:

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


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

打印A的内容时,将其打印为字节。因此,它将打印
Byte.MIN_值
Byte.MAX_值
-128
127
)之间的值

当您使用
is.read()
时,您将以无符号数字的形式读取内容,并将其作为
int
传递给您。此值将介于
0
255
之间

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

while( ( c = is.read() ) != -1 ){
    byte b = (byte)c;
    System.out.print(b + ":");
}
本质上,您需要将这两个数字转换为介于
0
255
之间或介于
-128
127
之间

您可以通过将
0
转换为
255
范围转换为
-128
127
,方法是将其转换为一个字节

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

ByteArrayInputStream
中的
read()
代码如下:

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