StringBuffer不会将整个流读入字符串(JAVA/Android)
我正在制作一个android程序,使用HttpURLConnection检索网页内容。我对Java和Android都是新手 问题是:阅读器读取整个页面源代码,但在最后一次while迭代中,它并没有将最后一部分附加到stringBuffer 使用debbuger,我已经确定,在上一次循环迭代中,创建了stringbuff,但是stringBuffer没有附加它 我需要解析检索到的内容。有没有比使用字符串更好的方法来处理解析内容。我在许多其他网站上读到,Java中的字符串大小仅受可用堆大小的限制。我也试过使用StringBuilder 任何人都知道问题出在哪里。顺便说一句,您可以对代码提出任何改进建议 谢谢StringBuffer不会将整个流读入字符串(JAVA/Android),java,android,string,httpurlconnection,bufferedreader,Java,Android,String,Httpurlconnection,Bufferedreader,我正在制作一个android程序,使用HttpURLConnection检索网页内容。我对Java和Android都是新手 问题是:阅读器读取整个页面源代码,但在最后一次while迭代中,它并没有将最后一部分附加到stringBuffer 使用debbuger,我已经确定,在上一次循环迭代中,创建了stringbuff,但是stringBuffer没有附加它 我需要解析检索到的内容。有没有比使用字符串更好的方法来处理解析内容。我在许多其他网站上读到,Java中的字符串大小仅受可用堆大小的限制。我
URL u;
try {
u = new URL("http://feeds.timesonline.co.uk/c/32313/f/440134/index.rss");
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestProperty("User-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)");
c.setRequestMethod("GET");
c.setDoOutput(true);
c.setReadTimeout(3000);
c.connect();
StringBuffer stringBuffer = new StringBuffer("");
InputStream in = c.getInputStream();
InputStreamReader inp = new InputStreamReader(in);
BufferedReader reader = new BufferedReader(inp);
char[] buffer = new char[3072];
int len1 = 0;
while ( (len1 = reader.read(buffer)) != -1 )
{
String buff = new String(buffer,0,len1);
stringBuffer.append(buff);
}
String stranica = new String(stringBuffer);
c.disconnect();
reader.close();
inp.close();
in.close();
您可能需要使用一个新的。或者,切换到使用来检索数据,特别是使用他们的
响应句柄
模式。我在J2SE和Android上测试了您的代码,效果很好。我添加了几行代码来比较J2SE的结果:
System.out.println("ITERATIONS: " + iterations);
System.out.println("LEN: " + stranica.length());
System.out.println("LAST 50 chars: "
+ stranica.substring(stranica.length() - 50, stranica
.length()));
FileWriter fw = new FileWriter("/tmp/tmp-j2se.txt");
fw.write(stranica);
fw.close();
和安卓:
System.out.println("ITERATIONS: " + iterations);
System.out.println("LEN: " + stranica.length());
System.out.println("LAST 50 chars: "
+ stranica.substring(stranica.length() - 50, stranica
.length()));
FileOutputStream fos = openFileOutput("tmp-and.txt",
Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
System.out.println(getFileStreamPath("tmp-and.txt")
.getAbsolutePath());
fos.write(stranica.getBytes());
fos.close();
我比较了两个文件,发现它们完全相同,但让我困惑的是,两个平台上字符串返回的长度不匹配:
J2SE:
LEN:22479
安卓:
05-22 20:28:22.733:信息/系统输出(455):镜头:22433
然而,在Android平台上获得的文件大小也有22479字节的长度。在没有进一步调查的情况下,我能找到的唯一解释是,一些编码(可能是行/结尾)翻译是透明的
回到您的问题,您的代码似乎(并被证明)是正确的。你在哪个Android平台版本/硬件上测试你的代码?旁注——这里的每个“新字符串”都是不必要的,只是在浪费内存。此外,最初无需将StringBuffer设置为“”。另外,请使用StringBuilder而不是StringBuffer。谢谢您的评论。我尝试使用相同的字符串,但字符串不会改变。它始终保持在初始化时设置的相同值。然后我在另一个网站上发现,不可能更改字符串的内容。只创建一个新字符串。这是真的吗?顺便说一句,我最初使用的是StringBuilder,但后来改为StringBuffer,因为我认为这造成了问题。我对Java和Android都是新手,在过去的6个小时里,我一直在努力做到这一点:PYou根本不需要字符串。只需调用stringBuffer.append(buffer,0,len1);非常感谢你。你帮了我很多。多大的错误啊。。。读了你的帖子后,我再次检查了我的代码。问题是Eclipse中的调试屏幕并没有显示整个字符串,但它似乎只显示前16k左右的字符。所以我认为它没有附加最后一次迭代。顺便说一句,现在我有一个如何写入文件的例子。再次感谢P我正在使用Eclipse、Emulator 1.6和2.1。很高兴这个答案帮助了YouTunks。我也可以使用HttpClient检索二进制数据吗?可以,不过没有内置的
ResponseHandler
。我曾经为一份咨询合同写过一篇文章,大概有六行左右的代码。