проблема при загрузке файла (java)

Прежде всего, извините за мой плохой английский, это не мой родной язык. Я кодирую метод, который загружает файл из Интернета. Я знаю, что есть несколько способов сделать это, но моя проблема все еще возникает, независимо от того, какой метод я использую.

Код должен загрузить файл .torrent, и он это делает, но «окончательный» файл, похоже, поврежден. Позвольте мне провести вас через следующие фотографии:

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

тот же торрент-файл, но загруженный из моего java-кода wtf

Насколько я понимаю, процесс загрузки идет неправильно. Я попробовал следующие два способа, и оба они загружают одну и ту же «закодированную» вещь.

Возможное решение №1 — java.nio

  //Get .torrent file
public void getTorrentFile(String torrentURL, String fileName) {
   try {
    URL website = new URL(torrentURL);
    ReadableByteChannel rbc = Channels.newChannel(website.openStream());
    FileOutputStream fos = new FileOutputStream(fileName);
    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        } catch (MalformedURLException mue) { mue.printStackTrace(); }
        catch (IOException ioe) {
            ioe.printStackTrace(); }

        }
}

*Возможное решение №2 – Цикл*

    File torrentFile = new File(fileName);
    URLConnection conn = new URL(torrentURL).openConnection();

        conn.connect();

    try (InputStream in = conn.getInputStream(); OutputStream out = new                 FileOutputStream(torrentFile)) {
        int b = 0;
        while (b != -1) {
            b = in.read();
            if (b != -1) {
                out.write(b);

            }
        }
    } catch (IOException ioe) { ioe.printStackTrace(); }
    } catch (IOException ioe) { ioe.printStackTrace(); }

Как я уже говорил, эти 2 решения неверны. Они полезны для загрузки файла, но некоторые торренты, которые я хочу скачать, приходят поврежденными.

Почему мой файл приходит на мой компьютер «поврежденным»? Заранее спасибо.


person Sebastian96    schedule 28.06.2014    source источник
comment
Судя по внешнему виду, я предполагаю, что вам где-то не хватает аргумента кодировки, но где именно, я не уверен.   -  person awksp    schedule 28.06.2014
comment
Вы забыли закрыть свой поток вывода (или, по крайней мере, сбросить его). Вызовите fos.close() в блоке finally, и это, вероятно, решит вашу проблему.   -  person Guillaume Polet    schedule 28.06.2014
comment
Какое это имеет отношение к Swing или вашей IDE?   -  person Andrew Thompson    schedule 28.06.2014
comment
Возможно, ответ заархивирован. Взгляните на этот ответ: stackoverflow.com/a/4818627/2719186   -  person Dave Morrissey    schedule 28.06.2014


Ответы (1)


Вам нужно проверить заголовки ответа; в частности, «тип контента», «кодирование контента» и «кодирование передачи». После вызова conn.connect() добавьте вызов getHeaderFields() и распечатайте содержимое карты.

В зависимости от того, что вы там видите, вам может понадобиться добавить заголовки запроса, чтобы указать серверу кодировать тело ответа по-разному.

Обратитесь к Спецификации HTTP 1.1, чтобы узнать, что означают различные заголовки ответов. Также читайте о заголовках accept-*, которые вы можете установить в запросе.

person Stephen C    schedule 28.06.2014