#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