невозможно загрузить файлы данных с использованием Java - PullRequest
0 голосов
/ 21 января 2012

Мне нужно скачать файл с использованием Java.Я могу использовать этот код для загрузки текстовых файлов.Но у меня проблема с загрузкой файлов изображений [данных].Они записаны на диск поврежден.Что я тут не так сделал?

FileOutputStream fileOutputStream = new FileOutputStream(url
                .getPath().substring(url.getPath().lastIndexOf("/") + 1));
BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
String line = "";
long l = 0;
while (!(line = bufferedReader.readLine()).isEmpty()) {
    System.out.println(line);
    if (line.contains("Content-Length:")) {
        l = Long.parseLong(line.substring(
                "Content-Length:".length()).trim());
    }
}

byte[] bytes = new byte[socket.getSendBufferSize()];
BufferedWriter bufferedWriter = new BufferedWriter(
        new OutputStreamWriter(fileOutputStream));
int x = 0;
long fullLength = 0;
int length = 0;
DataInputStream dataInputStream = new DataInputStream(
        socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(
        fileOutputStream);
while (fullLength < l
        && (length = dataInputStream.read(bytes)) != -1) {
    dataOutputStream.write(bytes, 0, length);

    System.out.print(length + " ");
    bufferedWriter.flush();
    fullLength += length;
}

fileOutputStream.flush();
bufferedWriter.close();
socket.close();

1 Ответ

2 голосов
/ 21 января 2012

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

final URL url = new URL("http://upload.wikimedia.org/wikipedia/commons/9/94/Giewont_and_Wielka_Turnia.jpg");  //1
final InputStream input = url.openStream();  //2
final OutputStream output = new BufferedOutputStream(new FileOutputStream("giewont.jpg")); //3
IOUtils.copy(input, output);  //4
input.close();  //5
output.close();

По шагам:

  1. Создать URL, указывая на ресурс, который вы хотите загрузить.
  2. openStream() для чтения файла побайтно. Базовые реализации URL обрабатывают сокеты, Content-length и т. Д.
  3. Создать пустой файл для сохранения данных.
  4. Скопируйте содержимое input в output. Я использую IOUtils от Apache commons-io, чтобы избежать скучного и подверженного ошибкам копирования в цикле.
  5. Закройте оба потока. Вам необходимо закрыть input, чтобы закрыть реальный сокет (может быть, это произойдет неявно после окончания потоков?) И output, чтобы очистить буферы.
  6. ... вот и все!

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

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