Android: Как загружать двоичные файлы из Интернета

#java #android #url #download

#java #Android #url #Скачать

Вопрос:

Я хочу загрузить файл из Интернета. И пока у меня есть ff. codes:

 package com.example.downloadfile;

import java.io.BufferedOutputStream;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class DownloadFile extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView tv = new TextView(this);

        String url = "http://www.fullissue.com/wp-content/uploads/2010/12/Adam-Lambert.jpg";
        String FileName = "/LocalDisk/jm"; // save in your sdcard


        try{

            java.io.BufferedInputStream in = new java.io.BufferedInputStream(new java.net.URL(url).openStream());
            java.io.FileOutputStream fos = new java.io.FileOutputStream(FileName);
            java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
            byte[] data = new byte[1024];
                int x=0;
                while((x=in.read(data,0,1024))>=0){
                    bout.write(data,0,x);               
                }
            fos.flush();
            bout.flush();
            fos.close();
            bout.close();
            in.close();

        }catch (Exception e){
            /* Display any Error to the GUI. */
            tv.setText("Error: "   e.getMessage());
        }

      this.setContentView(tv);
    }
}
  

Я получаю сообщение об ошибке, когда я запускаю этот код, я получаю «Ошибку: / LocalDisk / jm» в моем пользовательском интерфейсе.

Заранее большое спасибо за любую помощь! Я новичок в Java и Android dev … 🙂

Комментарии:

1. При обработке исключения message не обязательно является самой важной частью. По крайней мере, не менее важны тип исключения и трассировка стека. Попробуйте e.printStackTrace() получить более подробную информацию о проблеме.

2. Также: .close() сбрасывает поток, нет необходимости вызывать flush() раньше. И закрытие bout также закроет fos .

Ответ №1:

String FileName = «/LocalDisk/jm»;

Это абсолютный путь, поэтому вы должны использовать его следующим образом

 String FileName = Environment.getExternalStorageDirectory()   "/jm"; // /sdcard/jm
  

Больше информации о getExternalStorageDirectory().
Также не рекомендуется загружать файл в потоке пользовательского интерфейса, потому что это блокирует работу и может привести к тому, что Activity не будет отвечать. Лучшим способом будет использовать AsyncTask для обработки этой операции в фоновом режиме и уведомления графического интерфейса пользователя, когда вы закончите.

Комментарии:

1. Я не использую SD-карту, только локальный диск, возможно ли это? Спасибо за совет, я сначала изучу AsyncTask. 🙂

2. Что такое LocalDisk? В основном существует два типа хранилища, внутреннее и внешнее. Внутренний — это внутреннее хранилище, а внешний — съемный носитель, такой как SD-карта.

3. Ах да, я имею в виду внутреннюю память : D