Android(安卓)应用软件开发(十一)文件下载
16lz
2021-01-24
使用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{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubHttpDownloader 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{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString 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();//如果文件已经存在则返回1if(fileUtils.isFileExist(path+fileName)){return 1;}else{//根据url地址得到文件输入流inputStream = getInputStreamFromUrl(urlStr);//将输入流写入SD卡,具体过程见FileUtils.javaFile 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;}}
更多相关文章
- 为android编译ffmpeg+x264+faac
- android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
- 在xml配置文件中设置字体加粗
- Android(安卓)MediaPlayer使用方法简单介绍
- android 数据共享
- android使用activity切换动画效果
- android camer 图片回显界面照片分享到微博、人人、彩信、蓝牙的
- Android应用程序窗口(Activity,Window,View)原理解析
- Android(安卓)Audio 数据流详解