Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
StringBuffer不会将整个流读入字符串(JAVA/Android)_Java_Android_String_Httpurlconnection_Bufferedreader - Fatal编程技术网

StringBuffer不会将整个流读入字符串(JAVA/Android)

StringBuffer不会将整个流读入字符串(JAVA/Android),java,android,string,httpurlconnection,bufferedreader,Java,Android,String,Httpurlconnection,Bufferedreader,我正在制作一个android程序,使用HttpURLConnection检索网页内容。我对Java和Android都是新手 问题是:阅读器读取整个页面源代码,但在最后一次while迭代中,它并没有将最后一部分附加到stringBuffer 使用debbuger,我已经确定,在上一次循环迭代中,创建了stringbuff,但是stringBuffer没有附加它 我需要解析检索到的内容。有没有比使用字符串更好的方法来处理解析内容。我在许多其他网站上读到,Java中的字符串大小仅受可用堆大小的限制。我

我正在制作一个android程序,使用HttpURLConnection检索网页内容。我对Java和Android都是新手

问题是:阅读器读取整个页面源代码,但在最后一次while迭代中,它并没有将最后一部分附加到stringBuffer

使用debbuger,我已经确定,在上一次循环迭代中,创建了stringbuff,但是stringBuffer没有附加它

我需要解析检索到的内容。有没有比使用字符串更好的方法来处理解析内容。我在许多其他网站上读到,Java中的字符串大小仅受可用堆大小的限制。我也试过使用StringBuilder

任何人都知道问题出在哪里。顺便说一句,您可以对代码提出任何改进建议

谢谢

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
。我曾经为一份咨询合同写过一篇文章,大概有六行左右的代码。