загрузка файлов в Java в несколько частей или сегментов - PullRequest
0 голосов
/ 02 июня 2018

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

обратите внимание, что "downloadSizeCombined" - это сумма всех байтов, которые загружены всеми потоками, а ArrayList "loadedSize "отслеживает байты, которые загружены одним потоком.

этот метод находится в классе Download, который расширяет SwingWorker.

public Void doInBackground() {
    ExecutorService es = Executors.newCachedThreadPool();
    for (int i = 0; i < MAX_NUMBER_OF_PARTS; i++) {
        int numOfThePart = i;
        es.execute(new Runnable() {
            @Override
            public void run() {
                RandomAccessFile file = null;
                InputStream stream = null;

                try {
                    while (Download.this.getStatus() == WAITINGLIST) {
                        Thread.sleep(1);
                    }
                    // Open connection to URL.
                    HttpURLConnection connection =
                        (HttpURLConnection) url.openConnection();

                    // Specify what portion of file to download.
                    int startByte = numOfThePart * sizeOfFile / MAX_NUMBER_OF_PARTS;
                    int endByte = ((numOfThePart + 1) * sizeOfFile / MAX_NUMBER_OF_PARTS) - 1;
                    if (numOfThePart == MAX_NUMBER_OF_PARTS)
                        endByte = ((numOfThePart + 1) * sizeOfFile / MAX_NUMBER_OF_PARTS);
                    connection.setRequestProperty("Range",
                        "bytes=" + ((startByte + downloadedSize.get(numOfThePart))) + "-" + endByte);

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

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

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

                    file = new RandomAccessFile(new File(s.getCurrentDirectory(), getFileName(url)),
                        "rw");
                    file.seek(startByte + downloadedSize.get(numOfThePart));

                    fileLocation = new File(s.getCurrentDirectory(), getFileName(url));

                    stream = connection.getInputStream();
                    while (status == CURRENT) {
                        file.seek(startByte + downloadedSize.get(numOfThePart));

                        byte buffer[];

                        buffer = new byte[MAX_BUFFER_SIZE];

                        // Read from server into buffer.
                        int read = stream.read(buffer);

                        if (read == -1)
                            break;

                        // Write buffer to file.
                        file.write(buffer, 0, read);
                        downloadedSizeCombined += read;
                        downloadedSize.set(numOfThePart, downloadedSize.get(numOfThePart) + read);

                        publish(numOfThePart);
                        while (status == PAUSED) {
                            Thread.sleep(1);
                        }

                    }

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // Close file.
                    if (file != null) {
                        try {
                            file.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

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

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июня 2018

Разве мы не можем использовать соединение UDP?Поэтому, если мы используем класс DatagramSocket, он в любом случае будет отправлять данные в пакетах.Попробуй это.Вернемся к этому в ближайшее время ..

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