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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java的网络编程和IO流来实现爬取网页a标签里面的文字数据。具体步骤如下: 1. 使用Java的URL类来打开网页,获取URLConnection对象。 2. 设置URLConnection对象的属性,如请求方式、超时时间等。 3. 通过URLConnection对象获取输入流,使用BufferedReader读取输入流中的网页内容。 4. 使用正则表达式或者第三方库(如jsoup)来解析网页内容,提取a标签里面的文字数据。 5. 将提取出来的文字数据输出到文件或者控制台。 下面是一个简单的示例代码,可以实现上述功能: ```java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; import java.util.regex.Matcher; import java.util.regex.Pattern; public class WebCrawler { public static void main(String[] args) throws Exception { String urlString = "https://www.example.com"; URL url = new URL(urlString); URLConnection conn = url.openConnection(); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); InputStream is = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line); } Pattern pattern = Pattern.compile("<a.*?>(.*?)</a>"); Matcher matcher = pattern.matcher(sb.toString()); while (matcher.find()) { System.out.println(matcher.group(1)); } br.close(); is.close(); } } ``` 在这个示例代码中,我们首先打开了一个网页,使用URLConnection对象设置了请求头和超时时间,并获取了输入流。然后我们使用BufferedReader读取了输入流中的网页内容,将其存放到了StringBuilder对象中。 接下来,我们使用正则表达式来解析网页内容,提取其中的a标签里面的文字数据。最后,我们将提取出来的文字数据输出到控制台。 需要注意的是,在实际的开发中,为了防止网站反爬虫,我们可能需要设置更多的请求头,或者使用代理IP等技术来隐藏我们的真实IP地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值