JAVA IO流 获取网页内容

在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流。


猜你喜欢

转载自blog.csdn.net/qq_35343446/article/details/79512172