下载数据量比较大的xml解决办法,避免StringBuffer字符串超出缓冲区



大家好,在做Android应用开发的时候,从服务器下载XML数据并解析,以前用的是StringBuffer来append完成的,对于数据量比较小的,没有问题;但是数据量过大的时候就报OutOfMemory(比如我的大约6.8M),原因就是AbstractStringBuilder的enlargeBuffer方法在容量不够。

以前的从服务器下载xml数据并解析代码:

	private String dataFromServer;

	public Object connectToHttp_Get(String urlStr) {
		try {
			URL url = new URL(urlStr);
			// 创建URL连接
			// Proxy proxy = new Proxy(Proxy.Type.HTTP, new
			// InetSocketAddress("61.152.126.138",22222));
			URLConnection urlConnection = url.openConnection();
			// 设置参数
			urlConnection.setConnectTimeout(30 * 1000);
			urlConnection.addRequestProperty("User-Agent", "J2me/MIDP2.0");
			// 连接服务器
			urlConnection.connect();
			InputStream in = new BufferedInputStream(urlConnection.getInputStream());
			InputStreamReader isr = new InputStreamReader(in, "GB2312");
			BufferedReader rbr = new BufferedReader(isr);
			StringBuffer  rsb = new StringBuffer ();
			String readLine = rbr.readLine();
			while (readLine != null) {
				rsb.append(readLine);
				readLine = rbr.readLine();
			}
			dataFromServer=rsb.toString();
			in.close();
			isr.close();
			rbr.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dataFromServer;

	}
这样对于小容量的xml数据来说StringBuffer可以连接,也没有超过它本身的缓冲区,直接转换为String后再调用sax解析方法,是可行的。

下面贴一下对于从服务器下载数据量比较大的xml,就不能用上面的StringBuffer来进行拼接了:代码如下:


	public String resolveBlobAVXml(String urlStr){
		try {
			URL url = new URL(urlStr);
			URLConnection urlConnection = url.openConnection();
			urlConnection.setConnectTimeout(30 * 1000);
			urlConnection.addRequestProperty("User-Agent", "J2me/MIDP2.0");
			urlConnection.connect();
			InputStream in = new BufferedInputStream(urlConnection.getInputStream());
			InputStreamReader isr = new InputStreamReader(in, "GB2312");
			//BufferedReader rbr = new BufferedReader(isr);
			SAXParserFactory factory = SAXParserFactory.newInstance();
			XMLReader reader = null;
			reader = factory.newSAXParser().getXMLReader();
			reader.setContentHandler(new ResolveCustInoXml());// 解析类
			reader.parse(new InputSource(isr));
			in.close();
			//isr.close();
			//rbr.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return downLoadSum+"-"+repeatSum;
	}
解析时直接解析流,而不是转换为xmlString再进行解析.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIS6缓冲区超过其配置限制 在IIS6上运行ASP的时候,有时候会出现:“IIS6缓冲区超过其配置限制”这个错误,原因是asp脚本最后产生的页面太大,超过缓冲区大小。我们的报表有服务器端分页,每页行数由用户设置,设置为0的时候表示一页显示,这样,当数据太多并且一页显示的时候会报错,比如有个固定资产的表,设置为每页30行的时候有580页,可以正常显示,但是设置为每页0行的时候就无法显示了,原来的代码处理的时候,每当记录数超过一定范围的时候(比如900条数据),就Respond.flush一下,清空缓冲区保证可以再使用。不过新版本代码中,没有合适的地方再加Respond.flush这一句,代码改起来比较麻烦。 从Google上搜索了一下解决办法,在这里集中一下,通通没有验证,不过应该有管用的;) 1.asp页面中合适的地方加入Respond.flush 以下都是各处copy的: -修改IIS配置的: 2.停止IIS服务,然后用记事本修改C:\WINDOWS\system32\inetsrv\MetaBase.xml 中的: AspBufferingLimit="4194304" //即默认4M 为: AspBufferingLimit="8388608" //改为8M或更多 重启IIS 3.可以在“C:\Inetpub\AdminScripts”路径下在命令行中输入: adsutil set w3svc/2/root/autoupdate/aspbuf-feringlimit -1 adsutil set w3svc/aspbufferinglimit -1 命令来将缓存还原(默认大小为4MB),如果当前需要Response的大小超过这个限制,那么可以尝试将-1改为相应的大小,比如40MB就是41943040: adsutil set w3svc/aspbufferinglimit 41943040 注:2,3应该是殊途同归。 4.在IIS中"主目录"-"配置"-"选项",将启用缓存前面的勾去掉,即禁用缓存。 注:比较怀疑这个说法,即便管用,对性能应该也有一些影响。不过还是列出来,以后可以试一下。 -修改单个页面的: 5.可以通过服务器端iis里设置缓冲区大小,也可以通过程序更改这一值 <%@ page buffer="10240kb" autoFlush="false" %> 注: buffer:他的值可以是"none"或者一个数值。 指定处理JSP工作时的out处理网页出入内容 的模式。如果值为none,那么就不会有缓存,而所有的输出都是由servletresponse的printerwriter。 若是一个数值,表示缓存的大小,单位是kb,那么输出的缓存大小至少会大于这个值。 根据autoFlush(可取true或者false)属性而定,输入内容超出缓存大小时是否要清除(true)还是产 生异常(false)。一般的,缓存设置为8kb以 6.可以在ASP应用程序的头部添加如下语句: <%Response.Buffer = False%> 注:同4. 个人认为如果第5个办法管用的话,还是比较好的,比较环保。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值