1

最新の Java (標準ライブラリのみを使用) で、できればその配列自体を提供することなく、EOF までのすべての標準入力をバイト配列に読み取る最も簡単な方法は何ですか? stdin データはバイナリ データであり、ファイルからのものではありません。

つまり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

GuavaとそのByteStreams.toByteArray方法を使用します。

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

サードパーティのライブラリを使用せずByteArrayOutputStreamに、一時バッファを使用します。

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();

...おそらく、を受け入れるメソッドにそれをカプセル化します。これは、とにかく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 に答える