Java:下载总是停止
Posted
技术标签:
【中文标题】Java:下载总是停止【英文标题】:Java: Download always stalls 【发布时间】:2012-04-14 18:22:06 【问题描述】:几天前,我遇到了一个让我头疼的严重问题:
所有基于 Java 的工具(Eclipse、Maven、android SDK 加载器...)在下载某些文件时都会出现问题:下载只是随机停止。
我已经在Superuser 描述了我的问题,但没有人能够帮助我解决我的问题。因此开始自己进行一些测试,并以本题结尾的示例代码结束。
有趣的是缓冲区大小对问题的影响很小。如果我将缓冲区大小减小到 1024,则在大多数情况下下载完成。
此代码是否只会在我的 Windows 系统上产生问题?
明确一点:我不想用 Java 开发下载程序 - 因此修复示例代码对我没有帮助 - 代码仅用于演示问题。
public static void main(String[] args)
try
URL url = new URL("http://mirror.netcologne.de/maven2/com/google/android/android/2.3.3/android-2.3.3.jar");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream in = conn.getInputStream();
byte[] buffer = new byte[10485760]; // 10MiB
long read = 0;
while (true)
int bytes = in.read(buffer, 0, buffer.length);
if (bytes < 0)
break;
read += bytes;
System.out.println("Bytes read: " + read);
conn.disconnect();
System.out.println("Finished");
catch (Exception e)
e.printStackTrace();
【问题讨论】:
它是如何停止的?它会抛出异常吗?会挂吗?是否超时?它是否读取了这么多字节而不是整个文件? @Marlin:数据流即将归零,没有异常也没有超时。有时它会在加载 ~ 1.4 MiB 后停止,有时会在 3.2 MiB(或其他值)时停止。 数据流停止时您等待了多长时间?数据流停止时的往返延迟是多少?您可以通过 ping 确定延迟。 @Marlin:我等了几分钟。请参阅链接的超级用户问题,了解在这种情况下网络延迟不是问题。 阅读超级用户的帖子, 【参考方案1】:您面临的问题是由 Java 7 引起的 - 详细来说,它赋予 IPv6 比 IPv4 更高的优先级。
此问题影响所有基于 Java 的软件,但仅发生在某些计算机上(可能取决于使用的 Internet 连接和/或本地网络组件,如交换机、路由器...)
您可以通过设置系统属性 java.net.preferIPv4Stack=true
将其更改回 Java 6 中使用的 IPv4
对于每个应用程序,此属性的设置是不同的。对于 Eclipse,您必须在 eclipse.ini 中设置它。
对于 Andoird SDK 管理器,您必须编辑文件 tools\android.bat
并将参数 -Djava.net.preferIPv4Stack=true
添加到文件末尾附近的 Java 调用中。
【讨论】:
以上是关于Java:下载总是停止的主要内容,如果未能解决你的问题,请参考以下文章