• 4月22日学习日志


    今天学习了普通单线程下载文件:

    public static void downLoad(String path,Context context)throws Exception
    {
      URL url = new URL(path);
      InputStream is = url.openStream();
      //截取最后的文件名
      String end = path.substring(path.lastIndexOf("."));
      //打开手机对应的输出流,输出到文件中
      OutputStream os = context.openFileOutput("Cache_"+System.currentTimeMillis()+end, Context.MODE_PRIVATE);
      byte[] buffer = new byte[1024];
      int len = 0;
      //从输入六中读取数据,读到缓冲区中
      while((len = is.read(buffer)) > 0)
      {
        os.write(buffer,0,len);
      }
      //关闭输入输出流
      is.close();
      os.close();
    }

    普通多线程下载:

    public class Downloader {
      //添加@Test标记是表示该方法是Junit测试的方法,就可以直接运行该方法了
        @Test
        public void download() throws Exception
        {
          //设置URL的地址和下载后的文件名
          String filename = "meitu.exe";
          String path = "http://10.13.20.32:8080/Test/XiuXiu_Green.exe";
          URL url = new URL(path);
          HttpURLConnection conn = (HttpURLConnection) url.openConnection();
          conn.setConnectTimeout(5000);
          conn.setRequestMethod("GET");
          //获得需要下载的文件的长度(大小)
          int filelength = conn.getContentLength();
          System.out.println("要下载的文件长度"+filelength);
          //生成一个大小相同的本地文件
          RandomAccessFile file = new RandomAccessFile(filename, "rwd");
          file.setLength(filelength);
          file.close();
          conn.disconnect();
          //设置有多少条线程下载
          int threadsize = 3;
          //计算每个线程下载的量
          int threadlength = filelength % 3 == 0 ? filelength/3:filelength+1;
          for(int i = 0;i < threadsize;i++)
          {
            //设置每条线程从哪个位置开始下载
            int startposition = i * threadlength;
            //从文件的什么位置开始写入数据
            RandomAccessFile threadfile = new RandomAccessFile(filename, "rwd");
            threadfile.seek(startposition);
            //启动三条线程分别从startposition位置开始下载文件
            new DownLoadThread(i,startposition,threadfile,threadlength,path).start();
          }
          int quit = System.in.read();
          while('q' != quit)
          {
            Thread.sleep(2000);
          }
        }
      
      
      private class DownLoadThread extends Thread {
        private int threadid;
        private int startposition;
        private RandomAccessFile threadfile;
        private int threadlength;
        private String path;
        public DownLoadThread(int threadid, int startposition,
            RandomAccessFile threadfile, int threadlength, String path) {
          this.threadid = threadid;
          this.startposition = startposition;
          this.threadfile = threadfile;
          this.threadlength = threadlength;
          this.path = path;
        }
        public DownLoadThread() {}
        @Override
        public void run() {
          try
          {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            //指定从什么位置开始下载
            conn.setRequestProperty("Range", "bytes="+startposition+"-");
            //System.out.println(conn.getResponseCode());
            if(conn.getResponseCode() == 206)
            {
              InputStream is = conn.getInputStream();
              byte[] buffer = new byte[1024];
              int len = -1;
              int length = 0;
              while(length < threadlength && (len = is.read(buffer)) != -1)
              {
                threadfile.write(buffer,0,len);
                //计算累计下载的长度
                length += len;
              }
              threadfile.close();
              is.close();
              System.out.println("线程"+(threadid+1) + "已下载完成");
            }
          }catch(Exception ex){System.out.println("线程"+(threadid+1) + "下载出错"+ ex);}
        }
        
      }
    }
  • 相关阅读:
    你以为在用SharePoint但事实上不是
    python 站点爬虫 下载在线盗墓笔记小说到本地的脚本
    CF 552C 进制转换
    ArcGIS制图——多图层道路压盖处理
    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
    ANTLR4权威參考手冊(一)
    Codeforces Round #270--B. Design Tutorial: Learn from Life
    二叉树近期公共父节点
    for循环遍历字符串的还有一种方法
    Android学习笔记技巧之垂直和水平滚动视图
  • 原文地址:https://www.cnblogs.com/20193925zxt/p/14909960.html
Copyright © 2020-2023  润新知