2012-05-29 26 views
2

这更像是一个良知问题,而不是技术问题:p 我正在编写一些java代码以从服务器下载文件...为此,我使用BufferedOutputStream方法的write()和BufferedInputStream方法的read()。Java BufferedOutputStream:要写多少字节

所以我的问题是,如果我使用一个缓冲区来保存字节,什么应该是要读取的字节数?当然我可以读取字节使用只是int byte = read()然后写入(byte),或者我可以使用缓冲区。如果我采用第二种方法,那么在定义每次读取\写入的字节数时,是否有任何方面需要注意?这个数字会影响我的计划吗?

Thks

回答

1

除非你有一个非常快速的网络连接,该缓冲区的大小并没有什么影响。我会说4k缓冲区会很好,尽管使用缓冲区的大小并没有什么坏处。

这同样可能适用于使用read()read(byte[]) ......假设您使用的是BufferedInputStream

除非你有一个非常快/低延迟的网络连接,瓶颈将是数据速率,网络和计算机的网络接口,可以维持。对于典型的互联网连接,应用程序可以将数据移动的速度比网络快两个或更多个数量级。所以除非你做一些愚蠢的事情(比如在未缓冲的数据流上做1字节读取),否则Java代码不会成为瓶颈。

+0

首先回答,并有一个很好的答案:p我将在1024-4096之间设置缓冲区的大小。 Thks –

0

什么是您的网络连接中的MTU(最大流量单位)?例如,如果您使用UDP,则可以检查该值并使用较小的字节数组。如果这不是一个问题,你需要检查内存如何吃你的程序。我认为1024 - 4096就会变好保存这些数据,并继续接受

+0

我不能靠MTU,因为这一计划将来自不同网络的执行。尽管如此,我将在1024-4096之间设置缓冲区的大小。 THKS。 –

1

的BufferedInputStream和的BufferedOutputStream通常依赖于System.arraycopy其实现。 System.arraycopy有一个本地实现,这可能依赖于memmove或bcopy。复制的内存量取决于缓冲区中的可用空间,但无论实现到本机代码是否相当高效,都不会影响应用程序的性能,无论您正在读/写的字节数是多少。

然而,相对于的BufferedInputStream,如果设置了标志的高限,新的内部缓冲可能需要创建。如果确实使用了标记,则读取比旧缓冲区中可用字节数多的字节可能会导致临时性能下降,尽管摊销性能仍然是线性的。

斯蒂芬c项,你更有可能看到由于网络性能问题。

+0

你的回答也是有效的,但是由于Stephen C是第一个回复,他是赢家:无论如何。 –

+0

@PauloRodrigues:不担心“赢”:-) –

0

如果您抽取数据,通常不需要使用任何Buffered流。只要确保使用传递给读取方法的适当大小(8-64k)的临时字节[]缓冲区(或者使用泵方法)。默认的缓冲区大小是大多数情况的使用过小(如果你使用一个更大的临时数组它将被忽略反正)

相关问题