admin 管理员组

文章数量: 887181

        这个demo演示从网上下载文件并保存到手机,demo中可以下载一个XML文件并在Console窗口输出,还可以下载一个MP3文件并保存到手机存储目录中的BoBoMusic文件夹中,下载保存成功会返回:0。(XML和MP3文件我已经传到百度的对象存储中,方便大家调用demo中的URL调试)

完整demo: 下载地址

首先:在Manifest文件中添加访问网络和读写存储的权限
    <uses-permission
        android:name="android.permission.INTERNET"/>
    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后:文件工具类 FileUtils.java

package fk.androiddemo_009;

import android.os.Environment;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * Created by Administrator on 2016/9/14.
 */
public class FileUtils {

    private String SDCardRoot;

    public FileUtils(){
        //得到当前外部存储设备的目录
        SDCardRoot= Environment.getExternalStorageDirectory()+File.separator;
        //File.separator为文件分隔符”/“,方便之后在目录下创建文件
    }

    //在SD卡上创建文件
    public File createFileInSDCard(String fileName,String dir) throws IOException {
        File file=new File(SDCardRoot+dir+File.separator+fileName);
        file.createNewFile();
        return file;
    }

    //在SD卡上创建目录
    public File createSDDir(String dir)throws IOException{
        File dirFile=new File(SDCardRoot+dir);
        dirFile.mkdir();//mkdir()只能创建一层文件目录,mkdirs()可以创建多层文件目录
        return dirFile;
    }

    //判断文件是否存在
    public boolean isFileExist(String fileName,String dir){
        File file=new File(SDCardRoot+dir+File.separator+fileName);
        return file.exists();
    }

    //将一个InoutStream里面的数据写入到SD卡中
    public File write2SDFromInput(String fileName,String dir,InputStream input){
        File file=null;
        OutputStream output=null;
        try {
            //创建目录
            createSDDir(dir);
            //创建文件
            file=createFileInSDCard(fileName,dir);
            //写数据流
            output=new FileOutputStream(file);
            byte buffer[]=new byte[4*1024];//每次存4K
            int temp;
            //写入数据
            while((temp=input.read(buffer))!=-1){
                output.write(buffer,0,temp);
            }
            output.flush();
        } catch (Exception e) {
            System.out.println("写数据异常:"+e);
        }
        finally{
            try {
                output.close();
            } catch (Exception e2) {
                System.out.println(e2);
            }
        }
        return file;
    }

}


下载工具类:HttpDownloader.java

package fk.androiddemo_009;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.HttpURLConnection;
import java.URL;

/**
 * Created by Administrator on 2016/9/14.
 */
public class HttpDownloader {
    String line=null;
    StringBuffer strBuffer=new StringBuffer();
    BufferedReader bufferReader=null;

    //下载小型的文档文件,返回文档的String字符串
    public String downloadFiles(String urlStr){
        try {
            InputStream inputStream=getInputStreamFromUrl(urlStr);
            bufferReader=new BufferedReader(new InputStreamReader(inputStream));
            while((line=bufferReader.readLine())!=null){
                strBuffer.append(line+'\n');
            }
        } catch (Exception e) {
            strBuffer.append("something is wrong!!");
            System.out.println("读取数据异常:"+e);
        } finally{
            try {
                bufferReader.close();
            } catch (Exception e) {
                strBuffer.append("something is wrong!!");
                e.printStackTrace();
            }
        }
        return strBuffer.toString();
    }

    //可以下载任意文件,例如MP3,并把文件存储在制定目录(-1:下载失败,0:下载成功,1:文件已存在)
    public int downloadFiles(String urlStr,String path,String fileName){
        try {
            FileUtils fileUtils=new FileUtils();
            if(fileUtils.isFileExist(fileName,path)) return 1;//判断文件是否存在
            else{
                InputStream inputStream=getInputStreamFromUrl(urlStr);
                File resultFile=fileUtils.write2SDFromInput(fileName,path,inputStream);
                if(resultFile==null) return -1;
            }
        } catch (Exception e) {
            System.out.println("读写数据异常:"+e);
            return -1;
        }
        return 0;
    }

    public InputStream getInputStreamFromUrl(String urlStr)throws IOException {
        //创建一个URL对象
        URL url=new URL(urlStr);
        //创建一个HTTP链接
        HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
        //使用IO流获取数据
        InputStream inputStream=urlConn.getInputStream();
        return inputStream;
    }

}


主界面:MainActivity.java

package fk.androiddemo_009;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

//1,在Manifest文件中注册Internet和读写SDCard的权限
//2,下载不能在主线程中进行,要开分线程
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button but1,but2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        but1=(Button)findViewById(R.id.but1);
        but1.setOnClickListener(this);
        but2=(Button)findViewById(R.id.but2);
        but2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v==but1){
            new downloadFileThread().start();
        }else if(v==but2){
            new downloadMP3Thread().start();
        }
    }

    class downloadFileThread extends Thread{
        public void run(){
            HttpDownloader httpDownloader=new HttpDownloader();
            String fileData=httpDownloader.downloadFiles("http://mystudy.bj.bcebos/AndroidDemo_009.xml");
            System.out.println(fileData);
        }
    }

    class downloadMP3Thread extends Thread{
        public void run(){
            HttpDownloader httpDownloader=new HttpDownloader();
            int downloadResult=httpDownloader.downloadFiles(
                    "http://fengkui.bj.bcebos/%E8%B6%B3%E9%9F%B3.mp3","BoBoMusic","足音.mp3");
            System.out.println("下载结果:"+downloadResult);
        }
    }
}


运行截图:



PS:有一点需要注意,在Android6.0及以上的系统,由于权限申请的改动,此demo安装后需要在APP管理中手动打开存储权限才能正常运行,否则无法向存储器中写数据,具体原因可以参考这两篇博文:
http://unclechen.github.io/2016/03/05/Android6.0%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9D%83%E9%99%90%E7%AE%80%E4%BB%8B/

http://unclechen.github.io/2016/03/06/Android6.0%E6%9D%83%E9%99%90%E9%80%82%E9%85%8D%E4%B9%8BSD%E5%8D%A1%E5%86%99%E5%85%A5/?utm_source=tuicool&utm_medium=referral

虚拟机中打开存储权限的位置:



如果想要在虚拟机上查看下载的MP3文件,可以在SDK目录下的platform-tools中利用adb.exe查看,命令如下,原来亦可以使用DDMS,但是现在需要打开权限挺麻烦。


本文标签: 文件 Android