Вопрос

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

Проблема в том, что читатель читает весь источник страницы, но в то время как итерация ее не добавляет к 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();
Это было полезно?

Решение

Я проверил ваш код на 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:

Лен: 22479.

Android:

05-22 20: 28: 22.733: info / system.out (455): Лен: 22433

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

Вернуться к точке вашего вопроса Ваш код кажется (и доказан) правильный. На какую версию / оборудование Platform Android вы тестируете свой код?

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top