如何在Java中将byte[]数组中的原始字节内容打印到标准输出?

16

我正在做和这里描述的项目相同:

将压缩后的数据包装成gzip格式

我的问题是,当我尝试打印字节时,得到了奇怪的结果。 我的问题出现在以下代码中(对于我的变量选择不好,我很抱歉):

    for(int k = 0; k < head.length; k++){
        System.out.write(head[k]);
    }

    for(int m = 0; m < a.size(); m++){
        int comprlength = a.get(m).getclength();
        for(int ii = 0; ii < comprlength; ii++){
            System.out.write(a.get(m).getcompr()[ii]);
        }
    }
    for(int j = 0; j < f1.length; j++){
        System.out.write(f1[j]);
    }
    for(int ll = 0; ll < total_d.length; ll++){
        System.out.write(total_d[ll]);
    }

最后两个for循环没有打印它们的字节数组内容。因此,在使用gzip时会出现意外的文件结尾错误。奇怪的是,如果我注释掉第二个for循环块(变量m和ii的块),就什么也不会打印出来。

那么,如何正确打印出我的字节数组的内容呢?为什么第一个for循环在第二个for循环没有被注释时可以正常打印,而如果注释掉第二个for循环,则什么也不会打印出来?

编辑:

更具体地说:

我想写出原始字节。 我想这样做,以便对于我的每个字节数组,它们的字节紧挨着彼此。


如果你使用System.out.write,你可能需要通过在代码末尾写一个'\n'字符来刷新输出流。 - codebox
2个回答

54
假设您的字节数组被称为buf
 System.out.println(Arrays.toString(buf));

编辑: 听起来你真正想做的是将字节写入标准输出,而不是打印它们。请参见http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html了解在流中打印和写入之间的区别。最简单的方法应该是调用write(byte[] b)方法:

System.out.write(buf);

3
字节是数字,我认为你完全可以将数字打印到控制台。这就是上面代码所做的。 - JB Nizet
但我想打印原始字节。 - XCBaller
谢谢,我在你建议之前已经遇到了PrintStream。它确实以我想要的方式打印出来。我还发现了我的代码中其他地方存在一个导致奇怪行为的错误。再次感谢。 - XCBaller
如何在缓冲模式下刷新stdout?(通常\n会这样做) - Vincent Alex

-3
 /* There is an image / ic_launcher in the drawable folder for which I am making ByteArray   */



    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.img);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] mByteArray = stream.toByteArray();

/* 这里我展示的是原始数据,而不是十六进制格式 */

    System.out.println(Arrays.toString(mByteArray));

我认为这会对你们有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接