今天剛剛學習完Android文件下載和寫入SD卡的,隨即作一個小結,以供之後學習查閱: java
1、文件下載 android
Android開發中,有時須要從網上下載一些資源以供用戶使用,Android API中已經提供了不少直接能夠用的類供你們使用,通常文件下載須要經過三個步驟: 服務器
1.建立一個HttpURLConnection對象: 網絡
- // 建立一個URL對象,urlStr指的是網絡IP地址
- url = new URL(urlStr);
- // 建立一個HttpURLConnection鏈接
- HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
2.得到一個InputStream對象:
- InputStream input=null;
- input=urlConn.getInputStream();
3.設置訪問網絡的權限:
- //在AndroidManifest.xml配置文件中加入權限信息
- <uses-permission android:name="android.permission.INTERNET"/>
2、訪問並寫入SD卡 ide
因爲手機內存有限,因此通常須要將資料放入大容量容器SD卡中,不一樣手機SD卡所在目錄不同,這就須要我們經過一個統一的函數找到SD卡所在的目錄,再對它進行操做,Android中提供了一個函數,能夠查找到基本上全部類型型號的手機SD卡所在的目錄: 函數
- //獲得當前設備SD卡的目錄
- Environment.getExternalStorageDirectory();
在訪問SD卡前還必須在配置文件中設置權限,這樣才能夠最SD卡進行存取操做: 工具
- //在AndroidManifest.xml配置文件中加入權限信息
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
如下是一個對SD操做常常用到的類,之後若是須要對SD卡操做,直接能夠拿過來用:
- public class FileUtils {
-
- private String SDPATH;
-
- public String getSDPATH() {
- return SDPATH;
- }
- public FileUtils() {
- //獲得當前外部存儲設備的目錄
- // /SDCARD
- SDPATH = Environment.getExternalStorageDirectory() + "/";
- }
- /**
- * 在SD卡上建立文件
- *
- * @throws IOException
- */
- public File creatSDFile(String fileName) throws IOException {
- File file = new File(SDPATH + fileName);
- file.createNewFile();
- return file;
- }
-
- /**
- * 在SD卡上建立目錄
- *
- * @param dirName
- */
- public File creatSDDir(String dirName) {
- File dir = new File(SDPATH + dirName);
- dir.mkdir();
- return dir;
- }
-
- /**
- * 判斷SD卡上的文件夾是否存在
- */
- public boolean isFileExist(String fileName){
- File file = new File(SDPATH + fileName);
- return file.exists();
- }
-
- /**
- * 將一個InputStream裏面的數據寫入到SD卡中
- */
- public File write2SDFromInput(String path,String fileName,InputStream input){
- File file = null;
- OutputStream output = null;
- try{
- creatSDDir(path);
- file = creatSDFile(path + fileName);
- output = new FileOutputStream(file);
- byte buffer [] = new byte[4 * 1024];
- while((input.read(buffer)) != -1){
- output.write(buffer);
- }
- output.flush();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- finally{
- try{
- output.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- return file;
- }
- }
3、實例演示 學習
在對以上文件下載和SD卡訪問基本知識瞭解的基礎上,下面進行舉例說明: 測試
文件下載通常有文本文件和字節文件,不一樣文件下載的方式不一樣,可是都須要經過上面所說的通常步驟,即都須要首先獲得一個InputStream對象,然 後在對這個對象進行不一樣的操做,如下是對一個圖片文件(字節文件)進行處理,咱們在以上FileUtils類的基礎上建立一個 HttpDownLoader類,以供文件下載時做爲工具類調用: this
- public class HttpDownloader {
- private URL url=null;
- FileUtils fileUtils=new FileUtils();
- public int downfile(String urlStr,String path,String fileName)
- {
- if(fileUtils.isFileExist(path+fileName))
- {return 1;}
- else{
-
- try {
- InputStream input=null;
- input = getInputStream(urlStr);
- File resultFile=fileUtils.write2SDFromInput(path, fileName, input);
- if(resultFile==null)
- {
- return -1;
- }
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- }
- return 0;
- }
- //因爲獲得一個InputStream對象是全部文件處理前必須的操做,因此將這個操做封裝成了一個方法
- public InputStream getInputStream(String urlStr) throws IOException
- {
- InputStream is=null;
- try {
- url=new URL(urlStr);
- HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
- is=urlConn.getInputStream();
-
- } catch (MalformedURLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- return is;
- }
- }
下面編寫Activity文件進行文件的操做:
- public class MainActivity extends Activity {
-
- private Button downfile=null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- downfile=(Button)findViewById(R.id.downfile);
- downfile.setOnClickListener(new View.OnClickListener() {
- downfile.setOnClickListener(new View.OnClickListener() {
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- HttpDownloader httpDownLoader=new HttpDownloader();
- int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg");
- if(result==0)
- {
- Toast.makeText(MainActivity.this, "下載成功!", Toast.LENGTH_SHORT).show();
- }
- else if(result==1) {
- Toast.makeText(MainActivity.this, "已有文件!", Toast.LENGTH_SHORT).show();
- }
- else if(result==-1){
- Toast.makeText(MainActivity.this, "下載失敗!", Toast.LENGTH_SHORT).show();
- }
- }
- });
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- }
注:在編寫文件下載的IP地址時,不要用本地地址,好比:127.0.0.1,因爲我在測試時用的Tomcat服務器,IP就直接用的本地地址,程序運行後一直沒有報錯,可是去SD卡中找文件時一直沒有找到文件,最後改成電腦的IP地址後問題解決了。
上例中首先定義了一個HttpDownLoader類的對象httpdownloader,再調用該對象的downfile()方法,方法中第一個參數指的是文件下載的URL,第二個參數指的是準備存放到SD卡中的目錄,第三個參數指的是文件存放的名稱。