1

现代Java(仅使用标准库)中读取所有标准输入直到EOF进入字节数组的最简单方法是什么,最好不必自己提供该数组?标准输入数据是二进制数据,并非来自文件。

即像Ruby的东西

foo = $stdin.read

我能想到的唯一部分解决方案是

byte[] buf = new byte[1000000];
int b;
int i = 0;

while (true) {
    b = System.in.read();
    if (b == -1)
        break;
    buf[i++] = (byte) b;
}

byte[] foo[i] = Arrays.copyOfRange(buf, 0, i);

...但即使对于 Java 来说,这似乎也非常冗长,并且使用了固定大小的缓冲区。

4

2 回答 2

4

我会使用番石榴及其ByteStreams.toByteArray方法:

byte[] data = ByteStreams.toByteArray(System.in);

在不使用任何 3rd 方库的情况下,我将使用 aByteArrayOutputStream和一个临时缓冲区:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[32 * 1024];

int bytesRead;
while ((bytesRead = System.in.read(buffer)) > 0) {
    baos.write(buffer, 0, bytesRead);
}
byte[] bytes = baos.toByteArray();

...可能将其封装在接受 an 的方法中InputStream,然后基本上相当于ByteStreams.toByteArray无论如何...

于 2013-09-21T18:43:59.007 回答
1

如果您正在从文件中读取,Files.readAllBytes就是这样做的方法。

否则,我会使用 ByteBuffer:

ByteBuffer buf = ByteBuffer.allocate(1000000);
ReadableByteChannel channel = Channels.newChannel(System.in);
while (channel.read(buf) >= 0)
    ;
buf.flip();
byte[] bytes = Arrays.copyOf(buf.array(), buf.limit());
于 2013-09-21T19:39:22.500 回答