Файл загрузки нескольких соединений Java - PullRequest
1 голос
/ 23 апреля 2010

Я хотел добавить несколько соединений в код ниже, чтобы иметь возможность загружать файлы быстрее. Может ли кто-нибудь помочь мне? Заранее спасибо.

public void run() {
    RandomAccessFile file = null;
    InputStream stream = null;

    try {
        // Open connection to URL.
        HttpURLConnection connection =
                (HttpURLConnection) url.openConnection();

        // Specify what portion of file to download.
        connection.setRequestProperty("Range",
                "bytes=" + downloaded + "-");

        // Connect to server.
        connection.connect();

        // Make sure response code is in the 200 range.
        if (connection.getResponseCode() / 100 != 2) {
            error();
        }

        // Check for valid content length.
        int contentLength = connection.getContentLength();
        if (contentLength < 1) {
            error();
        }

        /* Set the size for this download if it
        hasn't been already set. */
        if (size == -1) {
            size = contentLength;
            stateChanged();
        }

        // Open file and seek to the end of it.
        file = new RandomAccessFile("C:\\"+getFileName(url), "rw");
        file.seek(downloaded);

        stream = connection.getInputStream();
        while (status == DOWNLOADING) {
            /* Size buffer according to how much of the
            file is left to download. */
            byte buffer[];
            if (size - downloaded > MAX_BUFFER_SIZE) {
                buffer = new byte[MAX_BUFFER_SIZE];
            } else {
                buffer = new byte[size - downloaded];
            }

            // Read from server into buffer.
            int read = stream.read(buffer);
            if (read == -1) {
                break;
            }

            // Write buffer to file.
            file.write(buffer, 0, read);
            downloaded += read;
            stateChanged();
        }

        /* Change status to complete if this point was
        reached because downloading has finished. */
        if (status == DOWNLOADING) {
            status = COMPLETE;
            stateChanged();
        }
    } catch (Exception e) {
        error();
    } finally {
        // Close file.
        if (file != null) {
            try {
                file.close();
            } catch (Exception e) {
            }
        }

        // Close connection to server.
        if (stream != null) {
            try {
                stream.close();
            } catch (Exception e) {
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Вы можете использовать темы.

Поместите код для загрузки и обновления файла RandomAccessFile в Thread / Runnable и запустите несколько его экземпляров.

Используйте глобальный счетчик (синхронизированный доступ) для отслеживания того, сколько потоков завершило загрузку, и заставьте основной поток ждать, пока все потоки не увеличат счетчик, прежде чем закрывать файл.

Обязательно синхронизируйте весь доступ к RandomAccessFile, чтобы поток A не мог вызвать seek(somePosition), пока поток B записывает в другую часть файла.

0 голосов
/ 24 апреля 2010

Убедитесь, что вы в профиле, что вы придумали. Возможно, что издержки нескольких потоков и координация между ними могут замедлить код. Не делайте этого, если вы не уверены, что это узкое место, сложность кода возрастет, а отладка - нетривиально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...