Android从网络某个地址下载文件、写入SD卡

  首先创建一个HttpDownloader类,获取下载文件的网络地址,将文件下载下来以String流的方式返回:

    public String download(String urlStr){

      //urlStr为文件的网络地址,如http://192.168.1.105:8080/mp3/resources.xml
      StringBuffer sb = new StringBuffer();
      String line = null;
      BufferedReader buffer = null;
      try
      {
        //创建一个URL对象
        url = new URL(urlStr);
        //创建一个Http连接
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        //使用IO流读取数据
        buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
        while((line = buffer.readLine()) != null){
          sb.append(line);
        }
      }
      catch(Exception ex){
        ex.printStackTrace();
      }
      finally{
        try{
          buffer.close();
        }
        catch(Exception ex){
          ex.printStackTrace();
        }
      }
      return sb.toString();
    }
  }

  仍在此类下,定义下载文件并写入手机SD卡:

    public int downFile(String urlStr,String path,String filename){
      //urlStr网络下载地址,path:写入SD卡上的地址,filename下载文件名
      InputStream inputStream = null;
      try{
        //声明FileUtils对象
        FileUtils fileUtils = new FileUtils();
        if(fileUtils.isFileExist(filename,path)){
          return 1; //文件已经存在则返回1
        }
        else{
          //将下载文件存入inputStream流中
          inputStream = getInputStreamFromUrl(urlStr);
          //将下载的文件写入SD卡
          File resultFile = fileUtils.write2SDFromInput(path, filename, inputStream);
          if(resultFile == null){
            return -1; //写入失败则返回-1
          }
        }
      }
      catch(Exception e){
        e.printStackTrace();
        return -1;
      }
      finally{
        try{
          inputStream.close();
        }
        catch(Exception e){
          e.printStackTrace();
        }
      }
      return 0; //下载写入SD卡成功则返回0
    }
    public InputStream getInputStreamFromUrl(String urlStr) throws IOException{
      url = new URL(urlStr);
      HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
      InputStream inputStream = urlConn.getInputStream();
      return inputStream;
    }

  将下载的inputStream写入SD卡中,定义类FileUtils:

    public class FileUtils {
      private String SDCardRoot;

      public FileUtils() {
        // 得到当前外部存储设备的目录
        SDCardRoot = Environment.getExternalStorageDirectory()
          .getAbsolutePath();
      }

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

      /**
       * 在SD卡上创建目录
       *
       * @param dirName
      */
      public File createSDDir(String dir) {
        File dirFile = new File(SDCardRoot + dir + File.separator);
        dirFile.mkdirs();
        return dirFile;
      }

      /**
       * 判断SD卡上的文件夹是否存在
      */
      public boolean isFileExist(String fileName, String path) {
        File file = new File(SDCardRoot + path + File.separator + fileName);
        return file.exists();
      }

      /**
       * 将另一个InputStream里面的数据写入到SD中
      */
      public File write2SDFromInput(String path, String fileName,
        InputStream input) {
          File file = null;
          OutputStream output = null;
          try {
            createSDDir(path);
            file = createFileInSDCard(fileName, path);
            //文件写入流,就是将数据写入file文件
            output = new FileOutputStream(file);
            //定义buffer大小为4K,就是每读取4K的内容就像文件中写入一次
            byte buffer[] = new byte[1024 * 4];
            int temp;
            while ((temp = input.read(buffer)) != -1) {
            output.write(buffer, 0, temp);
            }
          output.flush(); //清空缓存
          } catch (Exception ex) {
            ex.printStackTrace();
          } finally {
            try {
              output.close(); //关闭写入流
            } catch (Exception ex) {
              ex.printStackTrace();
            }
          }
          return file;
      }
    }

时间: 2024-10-17 15:47:54

Android从网络某个地址下载文件、写入SD卡的相关文章

从网络上下载文件到sd卡上

String SDPATH = Environment.getExternalStorageDirectory() + "/"; String path = SDPATH + "files/"; /** * 此文件支持下载docx,pdf,xls,jpg, * @param urlStr * @param path * @param fileName * @return * -1:文件下载出错 * 0:文件下载成功 * 1:文件已经存在 */ public int

Android下载文件到SD卡

HttpURLConnection 上传方式: 尝试理解这两种流的区别: InputStreamReader 的读取方式: 1 //创建一个URL对象 2 URL url = new URL(urlString); 3 4 //创建一个HttpURLConnection 5 HttpURLConnetion urlConn = (HttpURLConnection)url.openConnecton(); 6 7 //读取数据 8 BufferReader buffer = new Buffer

Android实现网络多线程断点续传下载(转)

本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是:  (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 R

Android实现网络多线程断点续传下载

本示例介绍在Android平台下通过HTTP协议实现断点续传下载. 我们编写的是Andorid的HTTP协议多线程断点下载应用程序.直接使用单线程下载HTTP文件对我们来说是一件非常简单的事.那么,多线程断点需要什么功能? 1.多线程下载, 2.支持断点. 使用多线程的好处:使用多线程下载会提升文件下载的速度.那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度. HttpURLConnection.getContentLength();//获取下载文件的长度 Ra

Android 使用Log4j把日志写入SD卡,动态修改输出文件名称

一.Log4j简单使用 1. 下载log4j.jar http://logging.apache.org/log4j/2.x/ 2. 创建Java代码 public class Loggers { public static Logger logger = Logger. getLogger(Loggers. class); public static void init() { try { PatternLayout patternLayout = new PatternLayout(); p

java 从网络Url中下载文件

转自:http://blog.csdn.net/xb12369/article/details/40543649 /** * 从网络Url中下载文件 * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOExcepti

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

Android中使用log4j输出log内容到sd卡

在android中,实现输出log内容到sd卡中的文件里面,做法是: 还是相对来说,log4j,算是好用. 1.下载android的log4j的库(的封装) 去:http://code.google.com/p/android-logging-log4j/ 下载对应的android-logging-log4j-1.0.3.jar,加到项目中. 2.再去下载所依赖的apache的log4j库 去:http://logging.apache.org/log4j/1.2/download.html 下

Android(java)学习笔记173:Sd卡状态广播接收者

1.广播接受者 >什么是广播.收音机. 电台:对外发送信号. 收音机:接收电台的信号. >在android系统里面,系统有很多重要的事件: 电池电量低,插入充电器,sd卡被移除,有电话打出去,有短信发送进来. 使用广播机制步骤: (1)买收音机         public class SDStatusReceiver extends BroadcastReceiver (2)装电池          <receiver android:name="com.itheima.sd