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

标签 java android string httpurlconnection bufferedreader

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

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

使用 debbuger 我已经确定,在最后一个循环迭代中,创建了字符串 buff,但 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();

我比较了两个文件,发现它们是一样的,但令我困惑的是两个平台上 String 返回的长度不匹配:

J2SE:

LEN: 22479

安卓:

05-22 20:28:22.733: INFO/System.out(455): LEN: 22433

但是在Android平台上获取的文件大小也有22479字节的长度。在没有进一步调查的情况下,我能找到的唯一解释是某些编码(可能是行/结尾)翻译是透明完成的。

回到您的问题点,您的代码似乎(并证明)是正确的。您在哪个 Android 平台版本/硬件上测试您的代码?

关于java - StringBuffer 不会将整个流读入字符串 (JAVA/Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2888943/

相关文章:

java - gradle,如何在 flavor 构建 apk 中排除特定类

java - 是否可以将 CORS header 添加到 Tomcat 容器中来自 j_security_check 的响应

java - 如何访问firebase数组

java - 如何在 Android 上仅更新 Firebase 数据库上的特定字段

java - 字符串根本不起作用

java - Java 中有等效的 strpbrk 吗?以及如何使用它?

java - 从代码点整数列表生成 String 对象?

java - 如何从混合整数和浮点列表中一行初始化 ArrayList<Double>?

java - EJB RESTful Web 服务发布 xml 失败

javascript - 如何使用 Regex 将两个双引号替换为一个双引号而不捕获一个双引号的出现?