Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将InputStream转换为字节[]的最有效方法?_Java_Inputstream - Fatal编程技术网

Java 将InputStream转换为字节[]的最有效方法?

Java 将InputStream转换为字节[]的最有效方法?,java,inputstream,Java,Inputstream,编辑-基准测试代码 ChannelBufferInputStream responseStream = (ChannelBufferInputStream) response.getBodyAsStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try { int read = responseStream.read(); while (read != -1) {

编辑-基准测试代码

ChannelBufferInputStream responseStream = (ChannelBufferInputStream) response.getBodyAsStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
    int read = responseStream.read();
    while (read != -1) {
        byteArrayOutputStream.write(read);
        read = responseStream.read();
    }
} catch (IOException e) {
    e.printStackTrace();
    return internalServerError();
}
byte[] bytes = byteArrayOutputStream.toByteArray();
return ok(bytes).as(response.getHeader("Content-type"));
100+请求后的平均时间-46873

ChannelBufferInputStream responseStream = (ChannelBufferInputStream) response.getBodyAsStream();
long t1 = System.nanoTime();

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
    int read = responseStream.read();
    while (read != -1) {
        byteArrayOutputStream.write(read);
        read = responseStream.read();
    }
} catch (IOException e) {
    e.printStackTrace();
    return internalServerError();
}
byte[] bytes = byteArrayOutputStream.toByteArray();

long t2 = System.nanoTime();
System.out.println(t2-t1);
return ok(bytes).as(response.getHeader("Content-type"));
100+请求后的平均时间-45088

long t1 = System.nanoTime();
byte[] bytes;
try {
    bytes = org.apache.commons.io.IOUtils.toByteArray(responseStream);
} catch (Exception e) {
    return internalServerError();
}

long t2 = System.nanoTime();
System.out.println(t2-t1);

100+请求后的平均时间-20180

是。使用
ByteArrayOutputStream
而不是ArrayList。然后从InputStream读取字节块(不使用
available()
,这几乎永远不会使用),并将这些字节块写入ByteArrayOutputStream,直到
read()
方法返回-1。然后通过tearrayoutputstream调用
上的toByteArray()


你可以使用Guava的方法,它可以为你做所有这些,或者你可以阅读它的源代码,更好地了解它是如何做到的。阅读文章也可能会有所帮助。

为什么?此代码完全等同于
read(byte[])
,只是它对整个数据执行两个额外的复制步骤。你不需要这些。一次简单的
读取(字节[])
的速度是原来的几倍


available()
的使用也无效。您需要整个响应,而不仅仅是可以无阻塞地读取的部分。您需要循环。

方法有什么问题?这是多年来为实现这一目标而优化的。

嘿,马特,我已经看完了这篇文章。我在寻找最大效率。如果你这么关心它,你应该自己测量和比较不同的实现。但是,既然您说“它似乎运行得很快”,那么如果您想让代码运行得更快,这听起来并不像是一个瓶颈。看看这个@TiagoAlmeida在这里并不真正相关。@MattBall代码还没有部署到生产环境中,但由于每次加载页面时都会调用此代码,所以我希望它能尽快运行,以缩短页面加载时间。谢谢,让我来测试一下。我还将进行一些基准测试
available()
返回可以在不阻塞的情况下读取的字节数。它总是可以返回0(默认情况下是这样的)。看到一些速度的提高,我想知道为什么
sun.misc.IOUtils.readFully
的运行速度是所有其他方法的两倍?ByteArrayOutputStream.toByteArray()会创建一个新的数据副本,这是不必要的。有什么方法可以避免这种情况吗?谢谢,我现在正在做这些修复。我将在几分钟后显示差异。简单的read()不能保证(除非这个ChannelBufferInputStream实现带来了这种保证)整个流都被读取。也许这不是你真正的意思,但你需要一个读取循环,直到返回-1为止。@JBNizet同意,澄清。嘿,我不想只为一个函数导入一个库。好吧,随着时间的推移,你可能会在该库中使用更多的函数,这有什么害处?无论如何,它是开源的。阅读源代码,看看如果你不想要全部内容,他们是怎么做的。使用
sun.misc.IOUtils
怎么样?它内置于Java中,但我听说不要相信sun的库<代码>IOUtils.readFully(responseStream,-1,true)这会给我更快的结果。也许我会放弃使用ApacheCommons…那只是ApacheOne的旧版本,AFAIK。如果你曾经在IBM JVM上运行过,它就不一定存在。@sissonb你能用一个理由、参考或引用来支持你关于Suns库“不可信”的说法吗?你可能是对的,但如果没有证据,这是一个毫无帮助的声明。
ChannelBufferInputStream responseStream = (ChannelBufferInputStream) response.getBodyAsStream();
long t1 = System.nanoTime();

ArrayList<Byte> arrayList = new ArrayList<Byte>();
try {
    while (responseStream.available() > 0) {
        arrayList.add(responseStream.readByte());
    }
} catch (IOException e) {
    e.printStackTrace();
    return internalServerError();
}
Iterator<Byte> iterator = arrayList.iterator();
byte[] bytes = new byte[arrayList.size()];
int i = 0;
while (iterator.hasNext()) {
    bytes[i++] = iterator.next();
}

long t2 = System.nanoTime();
System.out.println(t2-t1);
return ok(bytes).as(response.getHeader("Content-type"));
long t1 = System.nanoTime();
byte[] bytes;
try {
    bytes = org.apache.commons.io.IOUtils.toByteArray(responseStream);
} catch (Exception e) {
    return internalServerError();
}

long t2 = System.nanoTime();
System.out.println(t2-t1);
long t1 = System.nanoTime();
byte[] bytes;
try {
    bytes = sun.misc.IOUtils.readFully(responseStream, -1, true);
} catch (Exception e) {
    return internalServerError();
}

long t2 = System.nanoTime();
System.out.println(t2 - t1);