猿问

使用 System.out.write 方法将 int 转换为字节数组并打印到控制台

我有这个程序:


public class Duplicates {

    public static void main(String[] args) {

        byte[] bytes = "hz".getBytes();

        for (int i = 0; i < 10_000_000; i++) {

            System.out.write(bytes, 0, bytes.length);

        }

    }

}

开始后我有输出:


hzhzhzhzhzhzhzhz .....hz


但是如果我尝试转换int 为字节数组并打印:


public class Duplicates {

    public static void main(String[] args) {

        byte[] bytes = ByteBuffer.allocate(4).putInt(666).array();

        for (int i = 0; i < 10_000_000; i++) {

            System.out.write(bytes, 0, bytes.length);

        }

    }

}

开始后我有输出:


� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �入


我想666在控制台的每一行打印 10,000,000 次,并且使用的内存不超过 20MB 或 1 秒。


我究竟做错了什么?


编辑如果我将使用示例@Justin -Integer.toString(i).getBytes()我有这个:

胡子哥哥
浏览 177回答 2
2回答

缥缈止盈

您面临的问题不是调用,Integer.valueOf(666).toString()因为它只执行一次。实际的问题是,调用System.out.write()有一些开销。这可以通过使用填充了一些重复输入值的更大缓冲区来避免。这是我想出的:long start = System.currentTimeMillis();byte[] bytes = String.valueOf(666).getBytes();// use 20 mb of memory for the output bufferint size = 20 * 1000 * 1000&nbsp; / bytes.length;byte[] outBuffer = new byte[size * bytes.length];// fill the buffer which is used for System.out.write()for (int i = 0; i < size; i++) {&nbsp; &nbsp; System.arraycopy(bytes, 0, outBuffer, i * bytes.length, bytes.length);}// perform the actual writing with the larger bufferint times = 10_000_000 / size;for (int i = 0; i < times; i++) {&nbsp; &nbsp; System.out.write(outBuffer, 0, outBuffer.length);}long end = System.currentTimeMillis();System.out.println();System.out.println("Took " + (end - start) + "Millis");输出 666 千万次大约需要 600ms。

ABOUTYOU

这看起来是正确的。如果您将int666 转换为 a&nbsp;char,则将显示该内容。如果您想从字面上打印出 666,则需要将其转换int为String第一个:byte[]&nbsp;bytes&nbsp;=&nbsp;Integer.toString(input).getBytes();
随时随地看视频慕课网APP

相关分类

Java
我要回答