Android 应用软件开发(十一)文件下载
使用Http协议下载文件,写入SD卡中
下载步骤:
1、创建一个HttpURLConnection对象
HttpURLConnection urlConn =
(HttpURLConnection )url.openConnection();
2、获得一个InputStream对象
urlConn.getInoutStream()
3、设置网络访问权限(manifest文件中设置)
android.permission.INTERNET
访问SD卡:
1. 得到SD卡的目录
Environment.getExternalStorageDirectory()
2. 访问SD卡的权限:
android.permission.WRITE_EXTERNAL_STORAGE
注意:一定不要忘记设置权限
Manifest.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/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".DownloadActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!-- 设置网络下载权限和SD卡写入权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> </manifest>
DownloadActivity.java:
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 DownloadActivity extends Activity { /** Called when the activity is first created. */ 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); downloadMp3Button = (Button)findViewById(R.id.downloadMp3); downloadTxtButton.setOnClickListener(new DownLoadTxtListener()); downloadMp3Button.setOnClickListener(new DownLoadMp3Listener()); } class DownLoadTxtListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub HttpDownloader httpDownloader = new HttpDownloader(); String str = httpDownloader.download("http://ishare.sina.cn/download.php?action=loading&id=13912266&cid=05_14&p=1"); System.out.println("Download"); System.out.println(str); } } class DownLoadMp3Listener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub String urlStr = "http://ishare.sina.cn/download.php?action=loading&id=13912266&cid=05_14&p=1"; HttpDownloader httpDownloader = new HttpDownloader(); int state = httpDownloader.downFile(urlStr, "voa/", "myFile"); System.out.println(state); } } }
HttpDownloader.java:
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.MalformedURLException; 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(); //使用IO流读取数据 /** * urlConn.getInputStream()得到的是字节流 * 套一层InputStreamReader得到的是字符流 * 在套一层BufferedReader得到的字符流就可以使用readLine按行读取数据了 */ buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); while((line = buffer.readLine())!=null){ sb.append(line); } }catch(Exception e){ System.out.println("Error"); e.printStackTrace(); }finally{ try{ buffer.close(); }catch(Exception e){ e.printStackTrace(); } } return sb.toString(); } //下载文件并写入到SD卡中 //参数:url地址,文件存储目录绝对路径,存储的文件名 public int downFile(String urlStr,String path,String fileName){ InputStream inputStream = null; try{ FileUtils fileUtils = new FileUtils(); //如果文件已经存在则返回1 if(fileUtils.isFileExist(path+fileName)){ return 1; }else{ //根据url地址得到文件输入流 inputStream = getInputStreamFromUrl(urlStr); //将输入流写入SD卡,具体过程见FileUtils.java File resultFile = fileUtils.writeSDFromInput(path, fileName, inputStream); if(resultFile == null){ return -1; } } } catch(Exception e){ e.printStackTrace(); return -1; } finally{ try{ inputStream.close(); } catch(Exception e){ e.printStackTrace(); } } return 0; } //根据URL地址得到文件输入流 public InputStream getInputStreamFromUrl(String urlStr) throws MalformedURLException, IOException{ url = new URL(urlStr); HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); InputStream inputStream = urlConn.getInputStream(); return inputStream; } }
FileUtils.java:
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; /** * 此类是操作SD卡文件的封装 * 包括判断文件(夹)是否存在,创建文件(夹),将文件流写入文件 * * @author Administrator * */ public class FileUtils { //SD卡的路径名 private String SDPATH; public String getSDPATH(){ return SDPATH; } public FileUtils(){ //得到当前外部存储设备的目录 SDPATH = Environment.getExternalStorageDirectory()+"/"; } /** * 在SD卡上创建文件 * */ public File createSDFile(String fileName)throws IOException{ //根据文件的全路径名得到文件对象 File file = new File(SDPATH + fileName); //创建文件 file.createNewFile(); return file; } /** * 在SD卡上创建目录 */ public File createSDDir(String dirName){ File dir = new File(SDPATH + dirName); dir.mkdir(); return dir; } /** * 判断文件夹是否存在 */ public boolean isFileExist(String fileName){ File file = new File(SDPATH + fileName); return file.exists(); } /** * 将一个InputStream里面的数据写入到SD卡中 */ //参数:文件存放路径(绝对目录路径),文件名,输入流 public File writeSDFromInput(String path,String fileName,InputStream input){ File file = null; OutputStream output = null; try{ //创建文件存储目录 createSDDir(path); //创建文件 file = createSDFile(path+fileName); //获取新建文件的输出流 output = new FileOutputStream(file); //缓冲区 byte buffer [] = new byte[4 * 1024]; //从输入流中依次读入数据并输出到文件中,每次4个字节 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; } }