我找到了一个代码但有时会出错:
StringBuilder strHeaders = new StringBuilder();
char c;
while ((c = (char)stream.read()) != -1) {
strHeaders.append(c);
if (strHeaders.length() > 5 && (strHeaders.substring((strHeaders.length() - 4), strHeaders.length()).equals("\r\n\r\n"))) {
// end of headers
break;
}
}
logcat的
java.lang.OutOfMemoryError
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:140)
at java.lang.StringBuilder.append(StringBuilder.java:125)
at myApp.activity.com.getFromPLS.retreiveMetadata(getFromPLS.java:98)
at myApp.activity.com.getFromPLS.refreshMeta(getFromPLS.java:76)
at myApp.activity.com.myApp$1.run(myApp.java:371)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
此行错误
strHeaders.append(c);
请有人帮我解决这个问题吗?
答案 0 :(得分:5)
由于char
是无符号类型,即使在while
开始返回-1之后,也永远不会满足stream.read()
循环条件。如果找不到"\r\n\r\n"
序列,则循环将永远不会结束。像这样写循环:
StringBuilder strHeaders = new StringBuilder();
int c;
while ((c = stream.read()) != -1) { // DO NOT cast to char here!
strHeaders.append((char) c);
final int len = strHeaders.length();
if (len > 5 && (strHeaders.substring(len - 4)).equals("\r\n\r\n"))) {
// end of headers
break;
}
}
请注意,许多服务器将错误地返回"\n\n"
作为表示标题结尾的空白行。有些人也可能会返回"\r\r"
。除非您控制服务器输出并且保证它将看到"\r\n\r\n"
,否则您的空行检测方法需要以更强大的方式编写。
答案 1 :(得分:0)
这与您正在阅读的文件有关。如果文件大小很大,那么您将登陆此问题。最好的办法是检查文件大小并将其管理到较小的块。将数据放入StringBuffer的次数越多,内存的负载就越多。