while(rd.read()!=-1){
temp.append(rd.readLine())
}
问题就出在你的rd.read()上,你调用了一次read(),就会从底层的二进制流中读取一个byte出来,而“1”这个字符不论什么编码,都是只用一个byte表示,所以会丢了一个1。
正确的作法是这样:
String respStr = null;
while ( (respStr = rd.readLine() ) != null ) {
temp.append(respStr)
}
给你一个吧,这个能抓取任何程序import java.io.BufferedReader
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL
public class WebClient{
public static String getWebContent(String urlString,final String charset,int timeout) throws IOException {
if(urlString==null||urlString.length()==0) {
return null
}
urlString = (urlString.startsWith("http://") || urlString
.startsWith("https://")) ? urlString : ("http://" + urlString)
.intern()
URL url = new URL(urlString)
HttpURLConnection conn = (HttpURLConnection) url.openConnection()
conn
.setRequestProperty(
"User-Agent",
"Mozilla/4.0 (compatibleMSIE 6.0Windows NT 5.2Trident/4.0.NET CLR 1.1.4322.NET CLR 2.0.50727)")//增加报头,模拟浏览器,防止屏蔽
conn.setRequestProperty("Accept", "text/html")//只接受text/html类型,当然也可以接受图片,pdf,*/*任意,就是tomcat/conf/web里面定义那些
conn.setConnectTimeout(timeout)
try {
if(conn.getResponseCode()!=HttpURLConnection.HTTP_OK) {
return null
}
} catch (IOException e) {
e.printStackTrace()
return null
}
InputStream input = conn.getInputStream()
BufferedReader reader = new BufferedReader(new InputStreamReader(input,
charset))
String line = null
StringBuffer sb = new StringBuffer()
while ((line = reader.readLine()) != null) {
sb.append(line).append("\r\n")
}
if(reader!=null) {
reader.close()
}
if(conn!=null) {
conn.disconnect()
}
return sb.toString()
}
public static String getWebContent(String urlString) throws IOException {
return getWebContent(urlString,"iso-8859-1",5000)
}
public static void main(String[]args) throws IOException {
String s = getWebContent("http://www.sina.com")
s = new String(s.getBytes("iso-8859-1"),"gb2312")
System.out.println(s)
}
}
以下代码是Java实现Http的Post、Get、代理访问请求,可以参考一下
package com.snowfigure.kits.net
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStream
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import java.io.UnsupportedEncodingException
import java.net.HttpURLConnection
import java.net.InetSocketAddress
import java.net.Proxy
import java.net.URL
import java.net.URLConnection
import java.util.List
import java.util.Map
/**
* Http请求工具类
* @author snowfigure
* @since 2014-8-24 13:30:56
* @version v1.0.1
*/
public class HttpRequestUtil {
static boolean proxySet = false
static String proxyHost = "127.0.0.1"
static int proxyPort = 8087
/**
* 编码
* @param source
* @return
*/
public static String urlEncode(String source,String encode) {
String result = source
try {
result = java.net.URLEncoder.encode(source,encode)
} catch (UnsupportedEncodingException e) {
e.printStackTrace()
return "0"
}
return result
}
public static String urlEncodeGBK(String source) {
String result = source
try {
result = java.net.URLEncoder.encode(source,"GBK")
} catch (UnsupportedEncodingException e) {
e.printStackTrace()
return "0"
}
return result
}
/**
* 发起http请求获取返回结果
* @param req_url 请求地址
* @return
*/
public static String httpRequest(String req_url) {
StringBuffer buffer = new StringBuffer()
try {
URL url = new URL(req_url)
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection()
httpUrlConn.setDoOutput(false)
httpUrlConn.setDoInput(true)
httpUrlConn.setUseCaches(false)
httpUrlConn.setRequestMethod("GET")
httpUrlConn.connect()
// 将返回的输入流转换成字符串
InputStream inputStream = httpUrlConn.getInputStream()
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8")
BufferedReader bufferedReader = new BufferedReader(inputStreamReader)
String str = null
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str)
}
bufferedReader.close()
inputStreamReader.close()
// 释放资源
inputStream.close()
inputStream = null
httpUrlConn.disconnect()
} catch (Exception e) {
System.out.println(e.getStackTrace())
}
return buffer.toString()
}
/**
* 发送http请求取得返回的输入流
* @param requestUrl 请求地址
* @return InputStream
*/
public static InputStream httpRequestIO(String requestUrl) {
InputStream inputStream = null
try {
URL url = new URL(requestUrl)
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection()
httpUrlConn.setDoInput(true)
httpUrlConn.setRequestMethod("GET")
httpUrlConn.connect()
// 获得返回的输入流
inputStream = httpUrlConn.getInputStream()
} catch (Exception e) {
e.printStackTrace()
}
return inputStream
}
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = ""
BufferedReader in = null
try {
String urlNameString = url + "?" + param
URL realUrl = new URL(urlNameString)
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection()
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*")
connection.setRequestProperty("connection", "Keep-Alive")
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible MSIE 6.0 Windows NT 5.1SV1)")
// 建立实际的连接
connection.connect()
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields()
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key))
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()))
String line
while ((line = in.readLine()) != null) {
result += line
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e)
e.printStackTrace()
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close()
}
} catch (Exception e2) {
e2.printStackTrace()
}
}
return result
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @param isproxy
* 是否使用代理模式
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param,boolean isproxy) {
OutputStreamWriter out = null
BufferedReader in = null
String result = ""
try {
URL realUrl = new URL(url)
HttpURLConnection conn = null
if(isproxy){//使用代理模式
@SuppressWarnings("static-access")
Proxy proxy = new Proxy(Proxy.Type.DIRECT.HTTP, new InetSocketAddress(proxyHost, proxyPort))
conn = (HttpURLConnection) realUrl.openConnection(proxy)
}else{
conn = (HttpURLConnection) realUrl.openConnection()
}
// 打开和URL之间的连接
// 发送POST请求必须设置如下两行
conn.setDoOutput(true)
conn.setDoInput(true)
conn.setRequestMethod("POST") // POST方法
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*")
conn.setRequestProperty("connection", "Keep-Alive")
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible MSIE 6.0 Windows NT 5.1SV1)")
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
conn.connect()
// 获取URLConnection对象对应的输出流
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8")
// 发送请求参数
out.write(param)
// flush输出流的缓冲
out.flush()
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()))
String line
while ((line = in.readLine()) != null) {
result += line
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e)
e.printStackTrace()
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!=null){
out.close()
}
if(in!=null){
in.close()
}
}
catch(IOException ex){
ex.printStackTrace()
}
}
return result
}
public static void main(String[] args) {
//demo:代理访问
String url = "http://api.adf.ly/api.php"
String para = "key=youkeyid&youuid=uid&advert_type=int&domain=adf.ly&url=http://somewebsite.com"
String sr=HttpRequestUtil.sendPost(url,para,true)
System.out.println(sr)
}
}