Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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 FileChannel.transferTo()是否继续传输0字节?_Java_Nio - Fatal编程技术网

Java FileChannel.transferTo()是否继续传输0字节?

Java FileChannel.transferTo()是否继续传输0字节?,java,nio,Java,Nio,我昨天问过,我确信单线程文件服务器可以满足我的需要。是的,通过一个线程,文件服务器工作得非常好(仅适用于小文件),它每秒可以处理大约300个请求,现在的问题是服务器的写入(我使用FileChannel.transferTo())部分会因服务大文件而阻塞相当长一段时间,这会阻止其他连接被连接 我注意到在传输大文件(大约800KB)时,FileChannel.transferTo()有时传输0字节。它失败的原因是:java.io.IOException:重试。这是在Android上进行的 因为我将F

我昨天问过,我确信单线程文件服务器可以满足我的需要。是的,通过一个线程,文件服务器工作得非常好(仅适用于小文件),它每秒可以处理大约300个请求,现在的问题是服务器的写入(我使用
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个线程中,我很难理解这个主题。没有理由期望多线程文件传输的执行速度明显快于单线程传输。网络不是多线程的,磁盘也不是。