inputStream.read(data)导致的数据错误

本文详细解析使用Java的HttpURLConnection进行GET请求时遇到的字符溢出问题,通过调整字符串读取方式解决缓冲区残留字符导致的数据错误。

哎,java学的不精各种百度copy代码,结果弄出各种奇葩问题。这不百度了一个HttpURLConnection 模拟http请求的就出问题了:

String message = "";
	try {
		URL url = new URL(uri);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestMethod("GET");
		connection.setConnectTimeout(5 * 1000);
		connection.connect();
		InputStream inputStream = connection.getInputStream();
		byte[] data = new byte[1024];
		StringBuffer sb = new StringBuffer();
		int length = 0;
		while ((length = inputStream.read(data)) != -1) {
			String s = new String(data, Charset.forName("utf-8"));
			//Log.debug("Http.get", s);
			sb.append(s);
		}
		message = sb.toString();
		inputStream.close();
		connection.disconnect();
	} catch (Exception e) {
		e.printStackTrace();
	}
	return message;

他本来应该返回一段JSON,但是这段代码结尾总是会多出几个字符。

排除了服务器的问题后,终于发现了问题所在:

	String s = new String(data,Charset.forName("utf-8"));

关键部分就是这行代码,我的缓冲区是1024,但是因为内容比较长,分了两次读完。第一次读取了1024后,第二次只读取了100就读完了。于是这1000覆盖了缓冲区的前1000字节,但是剩下的24还在缓冲区!!!

改成下面这样

	String s = new String(data,0,length, Charset.forName("utf-8"));

 

哎,万恶之源的copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值