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卡上的文件中

 

原文地址:https://www.cnblogs.com/kyxyes/p/2913442.html