我从我的 Blackberry 应用程序调用 .Net Web 服务。在 KSoap2 遇到麻烦之后,我决定手动完成所有操作。这是一段代码:
byte [] postDataBytes = soapRequestEnvelope.getBytes();
byte [] dataRetrieved;
try
{
HttpConnection connection = (HttpConnection)Connector.open(URL);
connection.setRequestMethod(HttpConnection.POST);
connection.setRequestProperty("soapaction", soapAction);
connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
os = connection.openOutputStream();
os.write(postDataBytes);
int rc = connection.getResponseCode();
if(rc == HttpConnection.HTTP_OK)
{
inputStream = connection.openInputStream();
dataRetrieved = new byte[(int)connection.getLength()];
int bytesRead = inputStream .read(dataRetrieved);
}
else
{
dataRetrieved = null;
}
String dataString = new String(dataRetrieved);
//HttpConnection = javax.microedition.io.HttpConnection
//inputStream = java.io.InputStream
我遇到的问题是,我从 Web 服务调用返回的 XML 被缩短了。
当我将接收到的字节数打印到屏幕上时,有时会显示 1170(这实际上是我在这种特殊情况下期望的响应大小。)
但其他时候接收到的字节是702……为什么是702???
我连续测试了大约十几次,得到了以下结果:
1170, 702, 1170, 1170, 702, 1170, 1170, 702, 1170, 702, 1170, 702, 702, 702, 1170, 702
但是为什么是702?当它搞砸并且不起作用时,为什么它如此一致?虽然它总是分配 1170 字节,但为什么有时只读取 702?
这很奇怪。
编辑:我也尝试将 inputStream.available() 打印到屏幕上进行比较,完全不一致。它在 0、702 和 1170 之间变化。有时可用字节是 0 或 702,而读取的字节是 1170。我完全困惑了。
任何帮助将不胜感激。
谢谢
最佳答案
在我发表了一些模糊的评论之后,我想我应该具体说明“将 read
放入循环中”的含义。如defined ,read 将返回读取的字节数,如果到达文件末尾,则返回 -1
。
从套接字读取时,您可能会在所有数据从服务器返回给您之前调用 read()
。这样做的实际效果是,您调用 read()
并且返回的数据比您预期的要少。这仅仅意味着您需要再次调用它(一次又一次),直到获得所有数据。
我建议使用一个简单的固定大小缓冲区并循环遍历read()
直到得到-1
并对每个 block 执行一些操作(将其写入文件,例如。)这可以防止您需要将整个文件存储在内存中。例如:
byte buf[1024];
int len;
while((len = read(buf)) >= 0)
{
/* do something with len bytes of buf */
}
当然,您可以保证该文件会很小,并且您确实希望将整个文件都存储在内存中。在这种情况下,您可以(如上面所做的那样)只分配 connection.getLength()
大小的缓冲区,但是您需要调用 3-arg read(byte[] , int, int)
并做更多的整理工作:
int remain = (int) connection.getLength();
byte buf[remain];
int offset = 0, len;
while((len = read(buf, offset, remain)) >= 0)
{
offset += len;
remain -= len;
}
关于java - 将 http 响应读入输入流时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722549/