我的開發,若是有什麼錯誤或是各位高手有更好的實現方法請不吝賜教,這廂表示強烈感謝java
文件下載步驟:android
建立一個HttpURLConnection對象 HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();緩存
得到一個輸入流InputStream對象 urlConn.getInputStream()服務器
訪問網絡權限 android.permission.INTERNET (容許程序訪問網絡)寫入AndroidManifest.xml 的<uses-permission android:name="" />標籤內
若是要訪問SD,要再加入訪問SD卡的權限:android.permission.WRITE_EXTERNAL_STORAGE網絡
訪問SDCARDapp
獲得當前SD卡的目錄:
Environment.getExternalStorageDirectory()ide
完整工具類代碼:工具
HttpDownloader.javaurl
import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class HttpDownloader { private URL url; public static final int FILEEXIST = 1;//文件已經存在 public static final int DOWNLOADFAIL = -1;//文件下載失敗 public static final int DOWNLOADSUCCESS = 0;//文件下載成功 /** * 下載 text文本文件 * @param urlStr * @return */ public String download(String urlStr){ StringBuffer sb = new StringBuffer(""); String line = null; BufferedReader buffer = null; try { url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); while ((line = buffer.readLine()) != null) { sb.append(line + "\n"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return ""; }finally{ try { buffer.close(); } catch (Exception e) { return sb.toString(); } } return sb.toString(); } /** * 下載文件,原文件名默認爲原文件名 * @param urlStr 如今的文件的連接 * @param path 下載的文件存放到SD的目錄 * @param cover 當文件存在時是否覆蓋,true覆蓋 * @return */ public int download(String urlStr, String path, boolean cover){ File oldFile = new File(urlStr); return download(urlStr, path, oldFile.getName(), cover); } /** * 下載文件 * @param urlStr 如今的文件的連接 * @param path 下載的文件存放到SD的目錄 * @param fileName 文件名 * @param cover 當文件存在時是否覆蓋,true覆蓋 * @return */ public int download(String urlStr, String path, String fileName, boolean cover){ InputStream inputStream = null; if(FileUtils.isFileExist(path + fileName) && !cover){ return FILEEXIST; } try { inputStream = getInputStreamFromUrl(urlStr); File resultFile = FileUtils.writData2SDFromInputStream(path, fileName, inputStream); if(resultFile == null){ return DOWNLOADFAIL; } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); return DOWNLOADFAIL; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); //網絡文件未找到 return DOWNLOADFAIL; } try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return DOWNLOADSUCCESS; } /** * 根據url地址獲得輸入流 * @param urlStr * @throws MalformedURLException * @throws IOException */ public InputStream getInputStreamFromUrl(String urlStr)throws MalformedURLException,IOException{ HttpURLConnection urlConn = null; InputStream resInput = null; url = new URL(urlStr); urlConn = (HttpURLConnection)url.openConnection(); resInput = urlConn.getInputStream(); return resInput; } }
文件工具類FileUtils.java:spa
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.os.Environment; public class FileUtils { private static String SDPATH; static{ SDPATH = Environment.getExternalStorageDirectory() + File.separator; } /** * 在SD卡上建立文件 * @param fileName * @return * @throws IOException */ public static File creatFileOnSD(String fileName) throws IOException{ File file = new File(SDPATH + fileName); file.createNewFile(); return file; } /** * 在SD卡上建立目錄 * @param dirName * @return */ public static File creatDirOnSD(String dirName){ File dir = new File(SDPATH + dirName); dir.mkdir(); return dir; } /** * 判斷文件在SD卡上是否存在 * @param fileName * @return */ public static boolean isFileExist(String fileName){ File file = new File(SDPATH + fileName); return file.exists(); } /** * 將輸入流裏的數據寫入SD卡中 * @param path 寫入文件存放路徑 * @param fileName 生成的文件名 * @param input 輸入流 * @return */ public static File writData2SDFromInputStream(String path, String fileName,InputStream inputStream){ File file = null; OutputStream output = null; try { creatDirOnSD(path); file = creatFileOnSD(path + fileName); output = new FileOutputStream(file); //每4K輸出一次 byte buffer[] = new byte[4 * 1024]; while(inputStream.read(buffer) != -1){ output.write(buffer); } //清除緩存 output.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; }finally{ try { output.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return file; } }
Activity的代碼:
btnDownloadTxt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 獲得text內容 HttpDownloader httpDownloader = new HttpDownloader(); String res = httpDownloader.download("http://192.168.2.15:6060/tianfangUploadImg/text/news/ttt"); System.out.println(res); } }); btnDownloadMp3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub HttpDownloader httpDownloader = new HttpDownloader(); int res = httpDownloader.download("http://127.0.0.1:6060/test/sounds/test.mp3", "mp3/", "newMap3.mp3", true); if(HttpDownloader.DOWNLOADSUCCESS == res){ System.out.println("下載成功"); } if(HttpDownloader.DOWNLOADFAIL == res){ System.out.println("下載失敗"); } if(HttpDownloader.FILEEXIST == res){ System.out.println("文件已存在"); } } });
在網上查看有些高手說用android訪問本機電腦服務器可用ip:10.0.2.2
若是你想在模擬器simulator上面訪問你的電腦,那麼就使用android內置的IP 10.0.2.2 吧, 10.0.2.2 是模擬器設置的特定ip,是你的電腦的別名alias
記住,在模擬器上用10.0.2.2訪問你的電腦本機