Java 从API请求json时无法下载超过16144个字符

Java 从API请求json时无法下载超过16144个字符,java,android,json,http,download,Java,Android,Json,Http,Download,我有一个android应用程序,它以JSON的形式下载信息 典型的JSON下载大约有2000-3000个字符。但我想强调一下,所以我创建了一个更大的文件(约48000个字符)。随着文件的发展,它仍然很小,小于50kb 我的问题是下载时,我只得到16144个字符的数据。也就是说,reader.readLine()只返回一行16144个字符,就像client.execute(request,new BasicResponseHandler())一样。显然,对于文件的一部分,我的JSON解析代码很快就

我有一个android应用程序,它以JSON的形式下载信息

典型的JSON下载大约有2000-3000个字符。但我想强调一下,所以我创建了一个更大的文件(约48000个字符)。随着文件的发展,它仍然很小,小于50kb

我的问题是下载时,我只得到16144个字符的数据。也就是说,
reader.readLine()
只返回一行16144个字符,就像
client.execute(request,new BasicResponseHandler())一样。显然,对于文件的一部分,我的JSON解析代码很快就会失败,因为它不是一个有效的JSON对象

没有引发异常,因此这不是内存不足错误。而这个问题在HTC desire(2.2)和Galaxy Nexus(4.1.1)上是可以重复的,因此也不是特定于操作系统的。我已经在web浏览器中测试了URL,它工作正常,所有的JSON都可用,因此它不是服务器错误

问题

有人能指出为什么它只下载16144个字符,以及如何让它下载整个文件吗

方法#1

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);

InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
    str.append(line);
}
in.close();
result.setJSONResult(str.toString());
方法#2

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(uri);
HttpResponse response = client.execute(request);

String json = client.execute(request, new BasicResponseHandler());
result.setJSONResult(json);
注意-url位于LAN网络上(http://192.168.0.99:8080...),所以我没有包括它,因为它不会有用

更新-已修复


解决了这个问题。最后,我把它归结为一个文件传输问题,而不是手机的内存限制。当它在PC(Chrome)上运行时,我发现它在android以外的其他地方被破坏了,比如在网站上,而其他浏览器(Safari)不支持原始API调用。潜在的问题是Web服务器的代理ngix,它希望缓冲更大的响应(超过32kb),但它从未对用于缓冲的服务器文件夹拥有写入权限。这意味着它发送了部分文件,开始缓冲,并由于无法写入而遇到严重错误。当它出错时,它停止发送文件的其余部分,因此停止发送的字节数异常。谢谢你的帮助

您正在使用基于行的读取器读取非基于行的数据。当您调用
readLine
时,您要求它强制将所读取的内容转换为一行文本。如果数据实际上不是一行文本,这会损坏数据。

这是因为这是字符串可以容纳的最大大小——根据Java规范,总是2147483647(2^31-1),字符串类用于内部存储的数组的最大大小)或最大堆大小的一半(因为每个字符都是两个字节),以较小者为准

堆大小可能小于40kbs


您可以使用json阅读器而不是使用字符串来存储来自web的数据。请参阅

修复了该问题。最后,我把它归结为一个文件传输问题,而不是手机的内存限制。当它在PC(Chrome)上运行时,我发现它在android以外的其他地方被破坏了,比如在网站上,而其他浏览器(Safari)不支持原始API调用。潜在的问题是Web服务器的代理ngix,它希望缓冲更大的响应(超过32kb),但它从未对用于缓冲的服务器文件夹拥有写入权限。这意味着它发送了部分文件,开始缓冲,并由于无法写入而遇到严重错误。当它出错时,它停止发送文件的其余部分,因此停止发送的字节数异常。谢谢你的帮助

因为这是字符串可以容纳的最大大小——根据Java规范,总是2147483647(2^31-1),字符串类用于内部存储的数组的最大大小)或最大堆大小的一半(因为每个字符是两个字节),以较小者为准。这是设备的堆大小如果在模拟器上测试,请检查堆大小,它将小于40 kb。这就是为什么要检查avd管理器,然后选择avd click Edit。我不希望使用第三方JSON解析器。我们自己编写了解析JSON的代码,只使用标准android库中的JSONObject和JSONArray。该系统正在进行大量开发,我们得到的JSON可能会有显著差异,因此在我们自己的解析器中使用条件逻辑似乎是处理接收到的JSON的最佳方式。@JonWillis它不是第三方读取器它是androidFixed中的默认读取器解决了这个问题。我把它归结为一个文件下载问题。当它在PC(Chrome)上运行时,我发现它在android以外的其他地方被破坏了,比如在网站上,而其他浏览器(Safari)不能使用它。潜在的问题是Web服务器的代理ngix,它想缓冲较大的文件,但它从来没有写权限。这意味着它发送了部分文件,并由于无法写入而遇到严重错误。当它出错时,它停止发送文件的其余部分。谢谢你的帮助谢谢你的建议但我不确定这是否是问题所在。JSON确实包含包含换行符的文本数据,\n但是这些换行符似乎被忽略了,也就是说,其中的几个换行符是在一个语句reader.readLine()中读取的,如果响应中的字符少于16000,则可以正常工作。16144个字符位于一个单词的中间,这给我指明了一个不同的根本问题。但我将稍后尝试reader.read(),并一次尝试一个字符。