• 0118 文件下载


    http协议下载 下载的文件写入sd卡 要创建HttpURLConnection对象、如何得到HttpURlCOnnection对象  HttpURLConnection urlConn=(HttpURLConnection)url.openCOnnection(); 通过此对象获得一个输入流 urlConn.getInputStream(); 对文件操作一定会有输入流和输出流 输入流就是向程序中读入数据 输出流是向目标写出数据

    访问网络需要在Manifest文件中进行声明 android.permission.INTERNET

    将某种类可以封装起来(自己实现的某种功能的类,比如下载功能),以后调用起来就比较方便

    关于java的io流 下载文本文件,要先通过地址(String类型)得到文件,然后读取文本类文件,放入String中 读入的是字节流,通过InputStreamReader 转换成字符流 再通过 BufferedRead将字符转换 得到buffer 调用readline()就可以读取一行数据

    第一步,创建URL对象 private URL url; url=new URL(urlStr);  //将地址放在URL的构造函数里里面 第二步 通过URL对象创建HttpURLConnection对象(应该是按照http协议建立连接) HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); 第三步 得到Inputstream(相当于因特网和手机之间的管道) 通过url.getInputStream();得到 第四步 从InputStream当中读取数据 但是得到的是字节流,转换成字符流,再变成可读取行的buffer

    写入SDCARD 第一步要找到 sdcard 的位置 即得到当前设备sd卡的目录 Environment.getExternalStorageDirectory(); 一般目录名字都叫sdcard,但是不同的手机会有差异

    第二步要声明访问SD卡的权限 在manifest中声明 android.permission.WRITE_EXTERNAL_STORAGE

    想要将InputStream里面的数据写到SD卡中 要用public File write2SDFromInput()这个函数 File file=null;//已有路径,SDCARD目录后的路径,在该路径上创建 创建目录的方法(已有目录增添上新的目录名变成更长的目录)createSDDir(path) public File createSDDir(String dirName) { File dir= new File(SDPATH+dirName);//SDPATH是根目录 dir.mkdir();      根据路径名创建路径 return dir }

    创建目录后 创建文件(在路径上创建文件)file =createSDFile(path+fileName); public File createSDFile(String fileName)throws IOException { File file =new File(SDPATH+fileName);//SDPATH是根目录 file.createNewFile();    根据文件名创建文件 return file; }

    由上可知File有 创建路径还有创建文件两个方法 即dir 和file  mkdir() Creates the directory named by this file, assuming its parents exist.

    createNewFile() Creates a new, empty file on the file system according to the path information stored in this file.

    然后写入数据OutPutStream,将程序的数据写入到文件中去

    output = new FileOutputStream(file);

     Download_kyx.java

     1 package com.example.download_kyx;
     2 
     3 import java.io.IOException;
     4 
     5 import com.example.utils.HttpDownloader;
     6 
     7 import android.os.Bundle;
     8 import android.app.Activity;
     9 import android.view.View;
    10 import android.view.View.OnClickListener;
    11 import android.widget.Button;
    12 
    13 public class Download_kyx extends Activity {
    14 
    15     private Button downloadText;
    16     private Button downloadMp3;
    17     @Override
    18     protected void onCreate(Bundle savedInstanceState) {
    19         super.onCreate(savedInstanceState);
    20         setContentView(R.layout.activity_download_kyx);
    21         downloadText=(Button)findViewById(R.id.downloadText);
    22         downloadMp3=(Button)findViewById(R.id.downloadMp3);
    23         downloadText.setOnClickListener(new downloadTextListener());
    24         downloadMp3.setOnClickListener(new downloadMp3Listener());
    25 
    26         
    27     }
    28 public class downloadTextListener implements OnClickListener{
    29 
    30     @Override
    31     public void onClick(View v) {
    32         // TODO Auto-generated method stub
    33         HttpDownloader HDownloader=new HttpDownloader();
    34         String lrc=null;
    35         try {
    36             lrc = HDownloader.download("http://192.168.1.107:8080/voa1500/a1.lrc");
    37         } catch (IOException e) {
    38             // TODO Auto-generated catch block
    39             e.printStackTrace();
    40         }
    41         System.out.println(lrc);
    42     }
    43     
    44     
    45 }
    46 
    47 public class downloadMp3Listener implements OnClickListener{
    48 
    49     @Override
    50     public void onClick(View v) {
    51         // TODO Auto-generated method stub
    52         HttpDownloader HDownloader=new HttpDownloader();
    53         int result=-1;
    54         
    55             try {
    56                 result = HDownloader.downFile("http://192.168.1.107:8080/voa1500/a1.mp3", "voa/", "a1.mp3");
    57             } catch (IOException e) {
    58                 // TODO Auto-generated catch block
    59                 e.printStackTrace();
    60             }
    61         
    62         
    63         System.out.println(result);
    64         
    65     }
    66     
    67     
    68 }
    69 
    70     
    71 
    72 }

    Httpdonloader.java

      1 /**
      2      * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
      3      * 1.通过网址 创建一个URL对象
      4      * 2.通过URL对象,创建一个HttpURLConnection对象
      5      * 3.得到InputStram
      6      * 4.从InputStream当中读取数据
      7      * 以上将网上下载的数据变成流(即输入流InputStream)是字节流
      8      * @param urlStr
      9      * @return
     10      */
     11 package com.example.utils;
     12 
     13 import java.io.BufferedReader;
     14 import java.io.File;
     15 import java.io.IOException;
     16 import java.io.InputStream;
     17 import java.io.InputStreamReader;
     18 import java.net.HttpURLConnection;
     19 import java.net.MalformedURLException;
     20 import java.net.URL;
     21 
     22 import org.apache.http.HttpConnection;
     23 
     24 public class HttpDownloader
     25 {
     26     private URL url;
     27     public String download(String URLstr) throws IOException
     28     {
     29         StringBuffer sb= new StringBuffer();//对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些
     30         String line=null;
     31         BufferedReader buffer=null;//可以读取一整行的数据
     32         try {
     33             url=new URL(URLstr);
     34             HttpURLConnection HttpConn=(HttpURLConnection) url.openConnection();
     35             buffer=new BufferedReader(new InputStreamReader(HttpConn.getInputStream()));
     36             //获得字节流后(即获得InputStream),将字节流变成字符流(InputStreamReader)
     37             //再将字符流放入缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的(缓冲字符输入流)
     38             //可以读取一整行数据
     39             while((line=buffer.readLine())!=null)//读取一整行数据
     40             {
     41                 sb.append(line);//将每一行加入到sb中,因为数据要不断更改所以采用StringBuffer类
     42             }
     43             
     44         } catch (MalformedURLException e) {
     45             // TODO Auto-generated catch block
     46             e.printStackTrace();
     47         }finally
     48         {
     49             try{
     50             buffer.close();//清空缓存
     51             }
     52             catch (Exception e) {
     53                 e.printStackTrace();
     54             }
     55             
     56         }
     57         
     58         
     59         
     60         return sb.toString();
     61         
     62         
     63     }
     64     //下载mp3文件,将mp3文件写到SD卡上
     65     public int downFile(String urlStr,String path,String filename) throws IOException
     66     {
     67         InputStream input;
     68         File resultFile;
     69         FileUtils FU=new FileUtils();//FileUtils用于将input里的数据给output再往SD卡里写文件
     70         if(FU.isFileExist(path+filename))
     71         {return 1;}
     72         else//文件不存在则新建
     73         {
     74         
     75         //input的数据从网上下载下来放入input中
     76         input=getInputStreamFromURL(urlStr);//获得input
     77         resultFile=FU.write2SDFromInput(path, filename, input);//调用方法将input写入SD
     78         if(resultFile== null)//如果创建的文件不存在返回-1
     79         {
     80             return -1;
     81         }
     82         input.close();
     83         return 0;//创建成功 
     84         }
     85         
     86         
     87         
     88         
     89     }
     90     
     91     //获取inputStream的方法
     92     /**
     93      * 1.通过网址 创建一个URL对象
     94      * 2.通过URL对象,创建一个HttpURLConnection对象
     95      * 3.得到InputStram 通过getInputStream()
     96      * 4.从InputStream当中读取数据
     97      * 以上将网上下载的数据变成流(即输入流InputStream)
     98      * @param urlStr
     99      * @return
    100      */
    101     public InputStream getInputStreamFromURL(String urlStr)
    102             throws IOException{
    103         
    104         
    105         url=new URL(urlStr);
    106         HttpURLConnection HttpConn= (HttpURLConnection)url.openConnection();
    107         return HttpConn.getInputStream();
    108         
    109         
    110     }
    111 
    112     
    113     
    114 }


    FileUtils.java

     1 /**
     2      * 传入InputStream,此inputStream含有数据,将一个InputStream里面的数据写入到SD卡中
     3      * {1,创建在SD卡上的路径,创建在SD卡上文件
     4      * 将outputStream与新建的文件连接起来OutputStream output=new FileOutputStream(file);
     5      *[ 上面 因为FileOutputStream继承OutputStream,向上可以直接,向下要强制转换]
     6      * 创建字节数组,存储输入流(InputStream)input.read(buffer)
     7      * 4k一组,将数组中的数据写入输出流中(OutputStream),该输出流已经与建立在SD上的file连接好,所以就写到SD卡上了
     8      * }
     9      * 这里面的数据File可以是文本或者是mp3
    10      *
    11      */
    12 package com.example.utils;
    13 
    14 import java.io.File;
    15 import java.io.FileOutputStream;
    16 import java.io.IOException;
    17 import java.io.InputStream;
    18 import java.io.OutputStream;
    19 
    20 import android.R.bool;
    21 import android.os.Environment;
    22 
    23 public class FileUtils
    24 {
    25 
    26     private String SDPATH;
    27     public String getSAPATH()
    28     {
    29         return SDPATH;
    30     }
    31     public  FileUtils()
    32     {//得到根目录SDPATH
    33         // /SDCARD
    34         SDPATH=Environment.getExternalStorageDirectory()+"/";
    35     }
    36     public boolean isFileExist(String filename){
    37         File file=new File(SDPATH+filename);
    38         return file.exists();
    39         
    40     }
    41     
    42     //将下载下来的文件写入SD
    43     public File write2SDFromInput (String path,String filename,InputStream input) throws IOException
    44     {
    45         File file;
    46         OutputStream output;
    47         createSDdir(path);
    48         file=createSDfile(path+filename);//路径加文件名创建在SD卡上的文件
    49         output= new FileOutputStream(file);//文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
    50         //将FileOutPutStream和file连接起来,即写入到在SD卡的file中
    51         byte buffer[]= new byte[4*1024];//以4k为单位 每4k写一次
    52         while(input.read(buffer)!=-1)//将input流中的数据读入到buffer数组中
    53         {//int read( byte b[ ] ); //读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字节的数量 
    54             output.write(buffer);//将buffer数组中的数据写入到output流中(管道中,该管道已经连接了存放在SD卡上的file)
    55         }
    56         output.flush();//清空缓存
    57     
    58             try{
    59                 output.close();
    60             }
    61             catch(Exception e){
    62                 e.printStackTrace();
    63             }
    64     
    65         return file;
    66         
    67     }
    68     //第一个是在SD卡上创建目录,第二个是在SD卡上创建文件
    69     //都是 File a=new File();要创建路径a.mkdirs();创建文件a.createNewFile()
    70     public void  createSDdir(String path)
    71     {
    72         File dir=new File(SDPATH+path);//根目录加新目录
    73         dir.mkdirs();
    74     }
    75     public File createSDfile(String dirName) throws IOException
    76     {
    77         File file=new File(SDPATH+dirName);//根目录加新目录加文件名
    78         
    79             file.createNewFile();
    80         
    81         return file;
    82         
    83     }
    84 }

    关于输入输出流

    1,都是字节流

    2,要将字节流转换成字符流,如后放入缓存中,可以按行读取

    3,下载下来的文件,获取InputStream 的方式

     1 public InputStream getInputStreamFromURL(String urlStr)
     2             throws IOException{
     3         
     4         
     5         url=new URL(urlStr);
     6         HttpURLConnection HttpConn= (HttpURLConnection)url.openConnection();
     7         return HttpConn.getInputStream();
     8         
     9         
    10     }

    4,得到InputStream 的的处理方式

    一,可以将字节流转换成字符流,如后放入缓存中,可以按行读取

    二,存入SD卡中

    5,将此流(InputStream)交给FileUtils处理,通过FileUtils的write2SDFromInput()方法

    6,该方法首先通过传入的文件路径和文件名在SD卡上创建路径和文件

    7,将OutputStream 管道与创建好的文件链接起来(新的文件时空的)

    8,通过input.read(buffer);将流读入到buffer数组中

    9,通过output.write(buffer);将buffer写到流中,该流就将字节流写到在SD卡上的文件中

     

  • 相关阅读:
    VRChat简易教程1-开发环境准备(SDK)
    BeatSaber节奏光剑插件开发官方教程2-简单的插件示例
    BeatSaber节奏光剑插件开发官方教程1-创建一个插件模板
    BeatSaber节奏光剑双手柄MR教程
    第四章 HTML与JavaScript
    第二章数据和判定
    蓝港在线笔试经验
    数据结构总复习(查找)
    数据结构总复习(3)
    数据结构总复习(2)
  • 原文地址:https://www.cnblogs.com/kyxyes/p/2913442.html
Copyright © 2020-2023  润新知