2010-03-12 2 views
3

У меня есть объект InputStreamReader. Я хочу прочитать несколько строк в буфере/массиве, используя один вызов функции (без разбивки массива строковых объектов). Есть ли простой способ сделать это?Прочитайте несколько строк из InputStreamReader (JAVA)

+0

- это количество строк, которые вы хотите читать фиксированными или разнообразными? – Jason

+0

Исправлено, скажем, 100 строк, каждый из которых читается – amitlicht

+0

Являются ли линии фиксированной длины? –

ответ

3

Прежде всего помните, что InputStreamReader не так эффективен, вы должны обернуть его вокруг объекта BufferedReader для максимальной производительности.

Принимая во внимание это вы можете сделать что-то вроде этого:

public String readLines(InputStreamReader in) 
{ 
    BufferedReader br = new BufferedReader(in); 
    // you should estimate buffer size 
    StringBuffer sb = new StringBuffer(5000); 

    try 
    { 
    int linesPerRead = 100; 
    for (int i = 0; i < linesPerRead; ++i) 
    { 
     sb.append(br.readLine()); 
     // placing newlines back because readLine() removes them 
     sb.append('\n'); 
    } 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 

    return sb.toString(); 
} 

Ум, который возвращается readLine()null является EOF достигается, так что вы должны проверить и заботиться о нем.

+0

Цель в НЕ читать строки по строкам, так как она заполняет мою кучу избыточными строковыми объектами и делает GC диким. Я хотел прочитать из inputstreamreader (используя bufferedReader/whatever), не создавая много объектов String. Возможно, прочитайте непосредственно в буфер (не создавая строку в середине) или иначе прочитайте несколько строк, чтобы избежать мусора строки ... – amitlicht

+1

как насчет использования __RandomAccessFile__ для прямого чтения буфера байтов? Также весь файл (__readFull (byte [] b) __) – Jack

+0

Строки * очень * оптимизированы в JVM v. 1.6. Вы использовали профилировщик и действительно заметили проблему? Или вы просто догадываетесь? – incarnate

0

Если у вас есть разделитель для нескольких строк, вы можете прочитать, что многие символы используют метод чтения с длиной и смещением. В противном случае использование StringBuilder для добавления каждой строки, прочитанной BufferedReader, должно хорошо работать для вас, не съедая слишком много временной памяти.

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