这更像是一个良心问题,而不是一个技术问题:p 我正在编写一些java代码来从服务器下载文件...为此,我使用BufferedOutputStream方法write()和BufferedInputStream方法read()。
所以我的问题是,如果我使用缓冲区来保存字节,那么读取的字节数应该是多少?当然我可以使用int byte = read()然后write(byte)来读取字节到字节,或者我可以使用缓冲区。如果我采用第二种方法,那么在定义每次读取\写入的字节数时,我是否必须注意哪些方面?这个数字会对我的计划产生什么影响?
THKS
答案 0 :(得分:1)
除非你有一个非常快速的网络连接,否则缓冲区的大小差别不大。我会说4k缓冲区会很好,尽管使用缓冲区有点大不了。
同样可能适用于使用read()
与read(byte[])
...假设您使用的是BufferedInputStream
。
除非您拥有极快/低延迟的网络连接,否则瓶颈将是网络和计算机的网络接口可以承受的数据速率。对于典型的互联网连接,应用程序可以比网络更快地移动数据两个或更多个数量级。因此,除非你做一些愚蠢的事情(比如在无缓冲的流上进行1字节读取),否则你的Java代码不会成为瓶颈。
答案 1 :(得分:1)
BufferedInputStream和BufferedOutputStream通常依赖于System.arraycopy来实现它们。 System.arraycopy有一个本机实现,可能依赖于memmove或bcopy。复制的内存量取决于缓冲区中的可用空间,但无论如何,实现到本机代码都非常有效,无论您正在读/写多少字节,都不太可能影响应用程序的性能。
但是,对于BufferedInputStream,如果设置具有上限的标记,则可能需要创建新的内部缓冲区。如果使用标记,读取比旧缓冲区中可用字节更多的字节可能会导致临时性能损失,尽管分摊的性能仍然是线性的。
正如Stephen C所提到的,由于网络原因,您更有可能看到性能问题。
答案 2 :(得分:0)
网络连接中的MTU(最大流量单位)是多少?例如,如果使用UDP,则可以检查此值并使用较小的字节数组。如果没有这个,你需要检查内存是如何占用你的程序的。我认为1024 - 4096
将是保存此数据并继续接收
答案 3 :(得分:0)
如果您抽取数据,通常不需要使用任何缓冲流。只需确保使用传递给read方法的大小合适(8-64k)的临时byte []缓冲区(或者使用泵方法)。对于大多数用法,默认缓冲区大小太小(如果使用更大的临时数组,它将被忽略)