在Android音乐项目中:
获取Json字符串,由于json字符串显示在页面上,所以需要获取网页显示的内容。
基本思路如上。
public class HtmlService { public static String getHtml(String path) throws Exception { //将path转换为URL格式 URL url = new URL(path); //打开Http链接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置请求方式为GET conn.setRequestMethod("GET"); //设置连接超时时间 conn.setConnectTimeout(5 * 1000); //通过conn获取输入流(字节流)---inStream InputStream inStream = conn.getInputStream(); //将readInputStream返回的字节数组存入data中 byte[] data = readInputStream(inStream); //通过new String的方法。并设置utf-8的编码方式,转换为String类型 String html = new String(data, "UTF-8"); //将获取到的String类型的html返回 return html; } public static byte[] readInputStream(InputStream inStream) throws Exception{ //转换成字节数组 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //新建缓冲字节数组 byte[] buffer = new byte[1024]; int len = 0; /* JDK解释:read(Byte []b)一个参数 从输入流中读取一定量的字节,将其存入缓冲区数组buffer中 以整数形式返回其实际读取的字节数。 如果b的长度为0,或者不读取任何字节,则返回为0; 否则,尝试读取至少一个字节。 如果,流位于末尾而没有可用字节,则返回为-1; 否则,至少读取一个字节并将其存储在 b 中。 将读取的第一个字节存入buffer[0]中, 下一个存入buffer[1]中,以此类推。 读取的字节数最多等于buffer的长度。 */ while( (len=inStream.read(buffer)) != -1 ){ //每次读取8个字节作为一次循环 //将这8个字节存入的数组buffer作为参数 //写入outStream中 //将指定的byte数组从偏移量off开始的len个字节写入此输出流 outStream.write(buffer, 0, len); } //字节流操作之后,将资源关闭 inStream.close(); //将获得的outStream转换为字节数组,并返回 return outStream.toByteArray(); } }
其第二种demo:
在java中做的测试,比较全面。
package io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class TestByteArrayOutputStream { public static void main(String[] args) throws IOException { //打开某文件,转换成字节输入流之后返回 InputStream inputStream = readFile(); //将获取到的字节流作为参数输入,期待返回其字节流的字节数组 byte[] data = readInputStream(inputStream); //将得到的字节数组转换成String类型,并以GBK编码方式编码 String html = new String(data, "GBK"); //将结果进行输出 System.out.println("结果:--->"+html); } public static byte[] readInputStream(InputStream inStream) throws IOException{ System.out.println("进入readInputStream ok"); //生成输出字节数组对象 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); //新建缓冲字节数组 byte[] buffer = new byte[2]; //缓冲区数组偏移量len int len = 0; /* * 1.从输入流中读取某大小的字节 * 2.将读取的字节存入buffer缓冲区中 * 3.返回每个字节翻译成字符后的字符的个数 * 4.判断是否到末尾 */ while((len = inStream.read(buffer))!=-1){ System.out.println("len--->"+len); System.out.println("buffer[0]--->"+buffer[0]); System.out.println("buffer[1]--->"+buffer[1]); /* * 将缓冲区buffer,按从偏移量0开始,直到len长度这一块的数据 * 写入byteArrayOutputStream中 */ byteArrayOutputStream.write(buffer,0,len); } System.out.println("size--->"+inStream.available()); //使用完成io操作,关闭资源 inStream.close(); //返回字节数组输出流的字节数组 return byteArrayOutputStream.toByteArray(); } //获取流对象 public static InputStream readFile(){ System.out.println("进入readFile ok"); FileInputStream fis =null; String result = ""; try { //根据路径实例化一个输入流对象 fis = new FileInputStream("D://hello.txt"); //返回这个输入流对象可以被读的剩下的bytes字节的估计值 //int size = fis.available(); //System.out.println("readFile size--->"+size); /*//根据输入流的字节数size创建字节数组 byte[] array = new byte[size]; //将数据读入字节数组中 fis.read(array); //将字节数组转化成String字符串 result = new String(array);*/ //System.out.println("readFile size--->"+fis.available()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("退出readFile ok"); return fis; } }
基本理解了其概念,熟能生巧,期待以后能多次使用IO流。