您的位置:首页 > 编程语言 > Java开发

JAVA IO流 获取网页内容

2018-03-13 22:30 381 查看
在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流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: