Загрузка уже сегментированных файлов с NIO - Java 11 - PullRequest
0 голосов
/ 17 апреля 2019

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

Итак, у меня есть все URL-адреса всех сегментов в массиве, я делю еговручную в 4 секции, запустите 4 потока одновременно, а затем объедините их в один большой файл.Часть, где я думаю, что я могу улучшить свой код, находится в той части, когда я загружаю разделы.Цель состоит в том, чтобы открыть файлы один раз и добавить в них все сегменты.Я открыт для совершенно других решений.

static void downloadFileSection(int begin, int end, int marker, String[] segmentURLs, String segID) {
        try(var file = FileChannel.open(Path.of(segID + "_" + marker + ".seg"), WRITE, CREATE)){
            var byteArrayHandler = BodyHandlers.ofByteArray();

            IntStream.range(begin, end)
                      .forEach(index -> {

                          System.out.println("Downloading segment: " + index);

                          try {
                              //This is the part that I think is wrong. I shouldn't be creating a ByteBuffer every segment download.
                              //Main.sendNormalRequest is a method that sends a request using java 11-s HttpClient.send method.
                              file.write(ByteBuffer.wrap(Main.sendNormalRequest(segmentURLs[index], byteArrayHandler).body()));
                          } catch (IOException e) {
                              e.printStackTrace();
                          }
                      });
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

1 Ответ

0 голосов
/ 26 апреля 2019

Вы можете использовать BodyHandlers.ofPublisher () , чтобы получить Publisher<List<ByteBuffer>>.Затем, если статус 200 OK, предоставьте и подпишите свою собственную реализацию Flow.Subscriber<List<ByteBuffer>> и запишите байты в файл по мере их поступления в метод onNext(...).Если эти байты представляют текст, вам, возможно, придется позаботиться о кодировке / транскодировании символов, особенно если вам нужно записать файл в кодировке, отличной от той, которая отправляется сервером (обычно это будет UTF-8).

...