StringBuffer не будет прочитать весь поток в строку (Java / Android)
-
04-10-2019 - |
Вопрос
Я делаю программу 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
шаблон.