2013-10-10 5 views
0

пытаюсь прочитать ответ JSON с использованием буферизованного считывателя, как показано ниже. Я использую клиент Apache Commons Http. Ответ приходит как одиночная строка JSON, а количество символов около 1060000, а размер составляет около 1 МБ. Проблема, стоящая перед проблемой, только часть потока читается читателем, а другая часть отсутствует. Как я могу прочитать полный JSON без потери каких-либо данных? Связано это с «CharBufferSize» BufferedReader или без символов в потоке?JAVA IO: проблема с чтением потока с использованием BufferedReader

InputStream stream = method.getResponseBodyAsStream(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
StringBuilder builder = new StringBuilder(); 
String line; 
while ((line = reader.readLine()) != null) { 
    builder.append(line); 
} 
+0

получать какую-либо ошибку ??? –

+0

Вам не нужны * оба * BufferedInputStream * и * BufferedReader. Я даже не понимаю, зачем нужен StringBuilder. Разумеется, вы можете анализировать ответ прямо из сети? – EJP

+0

Отредактировано код.Yah BufferedInputStream не требуется. @HussainAkhtarWahid Не получается никаких ошибок. Но в конце я получаю только часть полной строки. – aravindaM

ответ

0

попробуйте использовать парсер json.

import org.codehaus.jackson.*; 

    JsonFactory fac = new JsonFactory(); 
    JsonParser parser = fac .createJsonParser(stream); 
0

Если вы просто хотите, чтобы скопировать полный поток в StringBuilder, вы должны использовать InputStreamReader и char -array буфера.

InputStream stream = method.getResponseBodyAsStream(); 

InputStreamReader reader = new InputStreamReader(stream, "UTF-8"); 
StringBuilder builder = new StringBuilder(); 

char[] buffer = new char[4096]; 
int read; 
while ((read = reader.read(buffer)) != -1) { 
    builder.append(buffer, 0, read); 
} 
0

Наконец я смог решить, используя IOUtils в библиотеке Apache Commons. Вот код.

BoundedInputStream boundedInputStream= new BoundedInputStream(stream); 
BufferedReader reader = new BufferedReader(new InputStreamReader(boundedInputStream,"UTF-8")); 

StringBuilder builder= new StringBuilder(); 
StringBuilderWriter writer = new StringBuilderWriter(builder); 

IOUtils.copy(reader, writer); 

Хотя это было какое-то время, это может быть полезно для кого-то.

Вот оригинальный источник, Most Robust way of reading a file or stream using Java (To prevent DoS attacks)

Смежные вопросы