【问题标题】:Byte [] used as a BufferInputStream ok butByte [] 用作 BufferInputStream 可以,但是
【发布时间】:2013-05-09 19:14:06
【问题描述】:

好的,我知道缓冲区实际上是一个字节数组,但是我从未见过以下声明(取自 here

URLConnection con = new URL("http://maps...").openConnection();
InputStream is = con.getInputStream();
byte bytes[] = new byte[con.getContentLength()];
is.read(bytes);

这是避免使用 BufferInputStream 对象的正确方法吗?这里我们有一个从字节 [] 读取的无缓冲流?不应该反过来吗? 提前致谢。

【问题讨论】:

  • 不是从 byte[] 读取,而是从 byte[] 读取。

标签: java io nio


【解决方案1】:

不,这不是正确的方法。方法 read() 最多读取 N 个字节,其中 N 是数组的长度。如果没有更多字节可用,它可以读取更少的字节(甚至 0)。已读取的字节数由方法read() 返回。当到达流的末尾时,该方法返回-1

因此正确的方法是循环读取字节:

byte[] buf = new buf[MAX];
int n = 0;
while ((n = stream.read(buf)) >= 0) {
    // deal with n first bytes from buf
}

【讨论】:

  • 为什么不使用 BufferedInputStream?
【解决方案2】:

或者使用 Apache commons-io

输入流是; byte[] bytes = IOUtils.toByteArray(is);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2012-04-11
    相关资源
    最近更新 更多