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