我正在尝试使用套接字从服务器读取响应,并且信息是UTF-8编码的。我将InputStream从InputStreamReader中的套接字包装起来,编码设置为“UTF-8”。
出于某种原因,似乎只有部分响应被读取,然后读数会挂起大约一两分钟然后结束。如果我将InputStreamReader上的编码设置为“ISO-8859-1”,那么我可以立即读取所有数据,但显然并非所有字符都能正确显示。
代码类似于以下
socketConn = (SocketConnection)Connector.open(url);
InputStreamReader is = new InputStreamReader(socketConn.openInputStream(), "UTF-8");
然后我阅读标题和内容。内容被分块,我读取每个块大小的行(从十六进制转换为十进制),以了解要读取多少。
我不理解两种编码的阅读差异及其可能产生的效果,因为它与ISO-8859-1没有问题,最终使用UTF-8,只有很长的延迟。
答案 0 :(得分:0)
很难找到延迟的原因。
您可以尝试其他方式从网络获取数据:
byte[] data = IOUtilities.streamToBytes(socketConn.openInputStream());
我相信上述内容应该毫不拖延地通过。然后从网络获得字节,您可以开始数据处理。请注意,您始终可以从表示UTF-8编码字符串的字节中获取String
:
String stringInUTF8 = new String(bytes, "UTF-8");
更新:查看此帖子的第二条评论。
答案 1 :(得分:-1)
我已经在移动中移除了块大小,所以我最终做了一些类似于IOUtilities答案的东西。我没有使用InputStreamReader而是使用了InputStream。 InputStream有一个可以填充字节数组的read方法,因此对于每个chunk,代码看起来像这样
byte[] buf = new buf[size];
is.read(buf);
return new String(buf, "UTF-8");
这似乎有效,不会造成任何延迟,我可以动态删除有关块的额外信息。