Java:下载总是停滞不前

时间:2012-04-14 18:22:07

标签: java windows-7 tcp download

前几天我遇到一个让我头痛的严重问题:

所有基于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();
    }
}

1 个答案:

答案 0 :(得分: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调用中。