Невозможно перенести файл из одного места в другое, используя коды Java - PullRequest
0 голосов
/ 09 марта 2011

Я использую что-то вроде этого:

HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(targerFile);
    HttpResponse response = httpclient.execute(httpGet);

    // get the response body as an array of bytes
    HttpEntity entity = response.getEntity();

    // write for the destination file

    InputStream instream = null;
    if (entity != null) {
        instream = entity.getContent();

        ByteArrayOutputStream bytOut = new ByteArrayOutputStream();
        int x;
        do {
            x = instream.read();
            if (x != -1) {

                bytOut.write(x);
                instream.close();
                bytOut.close();
            }
        } while (x != -1);
        FileOutputStream fout = new FileOutputStream(destinationFile);
        fout.write(bytOut.toByteArray());
        fout.close();

, но только тогда я узнаю, что входной поток от httpclient закрывается.так что я не смогу прочитать его более одного раза.есть ли работа для этого?или это не правильный способ сделать это?

Ответы [ 4 ]

4 голосов
/ 09 марта 2011

использовать org.apache.http.util.EntityUtils:

byte[] data = EntityUtils.toByteArray(response.getEntity());
httpClient.getConnectionManager().shutdown();

записать этот байт-массив в файл с FileUtils из commons-io:

FileUtils.writeByteArrayToFile(destinationFile, data);
2 голосов
/ 09 марта 2011

не закрывайте потоки внутри цикла. сделать это вне цикла после прочтения всего входного потока.

0 голосов
/ 09 марта 2011

Во-первых, ваша проблема в том, что вы закрываете входной поток в цикле после считывания первого байта. Не делай этого.

Во-вторых, нет смысла писать в ByteArrayOutputStream, если все, что вы собираетесь сделать, это просто записать его в FileOutputStream. Напишите прямо в файл.

В-третьих, используйте byte[] и BufferedInputStream и BufferedOutputStream, чтобы вы могли читать больше байтов за раз.

В-четвертых, не обращайте внимания на вышесказанное и просто используйте commons-io .

0 голосов
/ 09 марта 2011

мне кажется, что вы закрываете свой поток bytOut после считывания 1 байта.Но я бы сделал что-то вроде этого:

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
PrintWriter pw = new PrintWriter(new FileOutputStream(destinationFile));
while ((line = reader.readLine()) != null) pw.println(line);
pw.close();
reader.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...