Android中从服务器下载文件并写入到SD卡上。
工具类:
FileUtil.Java
- package com.lyc.util;
- import java.io.File;
- public class FileUtil {
- private static String SDPATH;
- public FileUtil(){
- //得到SD卡的目录,如:“sdcard/”
- SDPATH=Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator;
- }
- /**
- * 在SD卡的指定目录上创建文件
- * @param fileName
- */
- public File createFile(String fileName){
- File file=new File(SDPATH+fileName);
- try {
- file.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return file;
- }
- /**
- * 在SD卡上创建指定名称的目录
- * @param dirName
- */
- public File createDir(String dirName){
- File file=new File(SDPATH+dirName+File.separator);
- file.mkdir();
- return file;
- }
- /**
- * 判断指定名称的文件在SD卡上是否存在
- * @param fileName
- * @return
- */
- public boolean isExist(String dirName,String fileName){
- File file=new File(SDPATH+dirName+fileName);
- return file.exists();
- }
- /**
- * 通过URL得到HttpURLConnection,通过HttpURLConnection得到InputStream
- * @param urlStr
- * @return
- */
- public InputStream getIS(String urlStr){
- URL url=null;
- HttpURLConnection urlConn=null;
- InputStream is=null;
- try {
- url=new URL(urlStr);
- urlConn=(HttpURLConnection)url.openConnection();
- is=urlConn.getInputStream();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return is;
- }
- /**
- * 由得到的输入流把下载的文件写入到SD卡的指定位置
- * @param is
- * @param dirName
- * @param fileName
- * @return
- */
- public File IS2SD(InputStream is,String dirName,String fileName){
- OutputStream os=null;
- File file=null;
- try {
- createDir(dirName);
- file=createFile(dirName+fileName);
- os=new FileOutputStream(file);
- byte buffer[]=new byte[1024*4];
- int temp=0;
- while((temp=is.read(buffer))!=-1){
- os.write(buffer, 0, temp);
- }
- os.flush();
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- try {
- os.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return file;
- }
- }
下载文件的类:FileDownloader.java
- public class FileDownloader {
- private FileUtil fileUtil=null;
- public FileDownloader(){
- this.fileUtil=new FileUtil();
- }
- /**
- * 下载指定路径的文件,并写入到指定的位置
- * @param dirName
- * @param fileName
- * @param urlStr
- * @return 返回0表示下载成功,返回1表示文件已经在指定位置存在,返回2表示下载出错
- */
- public int downloadFile(String dirName,String fileName,String urlStr){
- if(fileUtil.isExist(dirName,fileName)){
- return 1;
- }
- File file=fileUtil.IS2SD(fileUtil.getIS(urlStr), dirName, fileName);
- if(file.length()==0 || file==null){
- return 2;
- }
- return 0;
- }
- /**
- * 通过文件在服务器的URL地址,下载到文件内容
- * @param urlStr
- * @return
- */
- public String download(String urlStr){
- StringBuffer sb=new StringBuffer();
- String line=null;
- InputStream is=fileUtil.getIS(urlStr);
- //由于InputStream流不方便使用,包装成处理流
- BufferedReader br=new BufferedReader(new InputStreamReader(is));
- try {
- while((line=br.readLine())!=null){
- sb.append(line);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- try {
- br.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return sb.toString();
- }
- }
在activity中操作下载,点击按钮下载:
- mp3.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- new Thread(new Runnable(){
- public void run() {
- int result=new FileDownloader().downloadFile("mp3/", "001.mp3", "http://192.168.1.100:8080/test/001.mp3");
- System.out.println("result="+result);
- }
- }).start();
- }
- });
不要忘记加上权限,访问网络和对SD卡读写的权限:
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>