Java http скачать поврежденный файл - PullRequest
3 голосов
/ 28 января 2009

У меня есть проблема, которую, похоже, я не могу решить ... Я делаю http загрузку файла, но CRC32 файла на сервере и на клиенте не совпадают. Кроме того, файл имеет другой размер, поэтому, очевидно, я должен делать что-то не так ... когда я загружаю через Firefox, размер файла в порядке ... так что я думаю, это где-то в клиентском коде.

Я уже нашел Поврежденный файл при использовании Java для загрузки файла , но это мне тоже не помогло ...

Вот код:

private void downloadJar(String fileName, long crc32Server) throws IOException {
  System.out.println("Downloading file '" + fileName + "' from server '" + mServer + "'.");
  HttpURLConnection sourceConnection = null;
  BufferedInputStream inputStream = null;
  BufferedWriter fileWriter = null;
  long crc32Client;
  try {
    URL sourceURL = new URL(fileName);
    try {
      sourceConnection = (HttpURLConnection)sourceURL.openConnection();
    }
    catch (MalformedURLException exc) {
      throw new RuntimeException("Configured URL caused a MalformedURLException: ", exc);
    }
    sourceConnection.setRequestProperty("Accept-Encoding", "zip, jar");
    sourceConnection.connect();
    inputStream = new BufferedInputStream(sourceConnection.getInputStream());
    fileWriter = new BufferedWriter(new FileWriter(targetFolder + File.separator + fileName));
    CRC32 crc32 = new CRC32();
    for (int singleByte = inputStream.read(); singleByte != -1; singleByte = inputStream.read()) {
      fileWriter.write(singleByte);
      crc32.update(singleByte);
    }
    crc32Client = crc32.getValue();
  }
  finally {
    if (inputStream != null) {
      inputStream.close();
    }
    if (fileWriter != null) {
      fileWriter.flush();
      fileWriter.close();
    }
    if (sourceConnection != null) {
      sourceConnection.disconnect();
    }
  }
  if (crc32Client != crc32Server) {
    //      deleteFile(fileName);
    throw new IOException("CRC32 did not match for file '" + fileName + "': " + crc32Client + "!="
        + crc32Server);
  }
}

1 Ответ

6 голосов
/ 28 января 2009

Вы должны использовать BufferedOutputStream вместо FileWriter / BufferedWriter. Как правило, *Streams обрабатывает необработанные двоичные данные, тогда как *Writers обрабатывает символьные данные (которые являются интерпретацией необработанных двоичных данных для заданной кодировки символов).

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