StringBuffer не будет читать весь поток в строку (JAVA / Android) - PullRequest
2 голосов
/ 22 мая 2010

Я создаю программу для Android, которая извлекает содержимое веб-страницы с помощью HttpURLConnection. Я новичок в Java и Android.

Проблема в том, что Reader читает весь исходный код страницы, но в последнюю итерацию он не добавляет к stringBuffer последнюю часть.

Используя debbuger, я определил, что в последней итерации цикла создается строковый бафф, но 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();

Ответы [ 2 ]

1 голос
/ 22 мая 2010

Я тестировал ваш код на 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();

и Android:

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

Android:

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

Однако размер файла, полученного на платформе Android, также имел длину 22479 байт. Единственное объяснение, которое я могу найти без дальнейшего изучения, заключается в том, что некоторые кодовые (возможно, строки / окончания) переводы выполняются прозрачно.

Возвращаясь к вопросу, ваш код кажется (и доказал) правильным. На какой версии Android Platform / Hardware вы тестируете свой код?

1 голос
/ 22 мая 2010

Возможно, вы захотите использовать более простую реализацию . Или переключитесь на использование HttpClient для извлечения данных, особенно с использованием их шаблона ResponseHandler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...