Java FileChannel.transferTo()是否继续传输0字节?
我昨天问过,我确信单线程文件服务器可以满足我的需要。是的,通过一个线程,文件服务器工作得非常好(仅适用于小文件),它每秒可以处理大约300个请求,现在的问题是服务器的写入(我使用Java FileChannel.transferTo()是否继续传输0字节?,java,nio,Java,Nio,我昨天问过,我确信单线程文件服务器可以满足我的需要。是的,通过一个线程,文件服务器工作得非常好(仅适用于小文件),它每秒可以处理大约300个请求,现在的问题是服务器的写入(我使用FileChannel.transferTo())部分会因服务大文件而阻塞相当长一段时间,这会阻止其他连接被连接 我注意到在传输大文件(大约800KB)时,FileChannel.transferTo()有时传输0字节。它失败的原因是:java.io.IOException:重试。这是在Android上进行的 因为我将F
FileChannel.transferTo()
)部分会因服务大文件而阻塞相当长一段时间,这会阻止其他连接被连接
我注意到在传输大文件(大约800KB)时,
FileChannel.transferTo()
有时传输0字节。它失败的原因是:java.io.IOException:重试。
这是在Android上进行的
因为我将FileChannel.transferTo()
放在一个循环中,所以我可以得到FileChannel.transferTo()
运行数千次以最终传输整个文件的情况
我的问题是什么导致
FileChannel.transferTo()
无法传输请求的字节?如何解决这个问题并使我的文件服务器在处理大文件时更具响应性?该方法不可能同时返回零和抛出异常,但我建议当您获得“重试”时,您应该减少传输计数。我会一直减半,直到病情消失。无论如何,您必须在循环中调用transferTo()
,这样才不会对代码产生太大影响。您是否面临任何IOException?java.io.IOException:再试一次。
我在Android上进行了测试。您的重复是正确的,“零”和“重试”不可能同时发生,但它们都发生了。我已经阅读了你的答案和评论,这有助于我理解NIO中一些棘手的部分。我将尝试使我的理解适应文件服务器的实现。我将需要工作线程来处理读取
s和写入
s。@Neveek不,你不需要,你只需要做我上面所说的。事实上,我尝试使用多个工作线程来执行IO,但它没有显示出更好的性能,甚至比单线程还要慢。为什么?你能详细说明一下吗?@Neevek在你开始的N个线程中,我很难理解这个主题。没有理由期望多线程文件传输的执行速度明显快于单线程传输。网络不是多线程的,磁盘也不是。