声明:此代码来源于mars老师的视频教程,粘贴到这里,纯用于个人学习,方便查阅,无其它意图。
1. 使用http协议下载文件
* 创建一个HttpURLConnection对象
- HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
* 获得一个InputStream对象
- urlConn.getInputStream()
* 访问网络的权限
- android.permission.INTENET
2. 将下载文件写入sdcard
* 访问sd卡的步骤:
- 得到当前设备SD卡的目录:Environment.getExternalStorageDirectory()
- 访问SD卡的权限:android.permission.WRITE_EXTERNAL_STORAGE
3. 实例代码
Download-->Activity
package mars.download; import mars.utils.HttpDownloader; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Download extends Activity { private Button downloadTxtButton; private Button downloadMp3Button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); downloadTxtButton = (Button) findViewById(R.id.downloadTxt); downloadTxtButton.setOnClickListener(new DownloadTxtListener()); downloadMp3Button = (Button) findViewById(R.id.downloadMp3); downloadMp3Button.setOnClickListener(new DownloadMp3Listener()); } class DownloadTxtListener implements OnClickListener { @Override public void onClick(View v) { HttpDownloader httpDownloader = new HttpDownloader(); String lrc = httpDownloader .download("http://9.125.233.**:8080/mp3/a1.lrc"); System.out.println(lrc); } } class DownloadMp3Listener implements OnClickListener { @Override public void onClick(View v) { HttpDownloader httpDownloader = new HttpDownloader(); int result = httpDownloader.downFile( "http://9.125.233.**:8080/mp3/a1.mp3", "voa/", "a1.mp3"); System.out.println(result); } } }
HttpDownloader
package mars.utils; 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.URL; public class HttpDownloader { private URL url = null; /** * 根据URL下载文件,前提是这个文件中的内容是文本,函数的返回值就是文件的内容 * 1.创建一个URL对象 * 2.通过URL对象,创建一个HttpURLConnection对象 * 3.得到InputStream * 4.从InputStream中读取数据 */ public String download(String urlStr) { StringBuffer sb = new StringBuffer(); String line = null; BufferedReader buffer = null; try { // 创建一个URL对象 url = new URL(urlStr); // 创建一个Http连接 HttpURLConnection urlConn = (HttpURLConnection) url .openConnection(); buffer = new BufferedReader(new InputStreamReader(urlConn .getInputStream())); // 使用IO流读取数据 while ((line = buffer.readLine()) != null) { sb.append(line); } } catch (Exception e) { e.printStackTrace(); } finally { try { buffer.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } /** * 将下载的mp3文件写到sdcard * * 该函数放回整型-1:代表下载文件出错 0:代表下载文件成功 1:代表文件已经存在 */ public int downFile(String urlStr, String path, String fileName) { InputStream inputStream = null; try { FileUtils fileUtils = new FileUtils(); if (fileUtils.isFileExist(path + fileName)) { return 1; } else { inputStream = getInputStreamFromUrl(urlStr); File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream); if (resultFile == null) { return -1; } } } catch (Exception e) { e.printStackTrace(); return -1; } finally { try { inputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return 0; } private InputStream getInputStreamFromUrl(String urlStr) throws IOException { url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConn.getInputStream(); return inputStream; } }
工具类FileUtils
package mars.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.os.Environment; /** * 访问sdcard的工具函数 * */ public class FileUtils { private String SDPATH; public String getSDPATH() { return SDPATH; } public void setSDPATH(String sdpath) { SDPATH = sdpath; } public FileUtils() { // 得到当前外部存储设备的目录,即: /SDCARD SDPATH = Environment.getExternalStorageDirectory() + "/"; } /** * 在SD卡上创建文件 * */ public File creatSDFile(String fileName) throws IOException { File file = new File(SDPATH + fileName); file.createNewFile(); return file; } /** * 在SD卡上创建目录 */ public File createDir(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 { createDir(path);//创建目录 File f = creatSDFile(path + fileName);//创建文件 output = new FileOutputStream(f); byte buffer[] = new byte[4 * 1024]; while ((input.read(buffer)) != -1) { output.write(buffer); } System.out.println(path); file = new File(path); } catch (Exception e) { e.printStackTrace(); } finally { try { output.close(); } catch (Exception e) { e.printStackTrace(); } } return file; } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mars.download" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Download" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!--必须添加以下权限,才能实现下载操作--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest>