2010-03-12 100 views
3

我有一个InputStreamReader对象。我想通过一个函数调用将多行读入缓冲区/数组(不包括大量的字符串对象)。有没有简单的方法来做到这一点?从InputStreamReader(JAVA)读取多行

+0

是你想读的固定或变化的行数? – Jason 2010-03-12 17:33:22

+0

固定,比如每行读取100行 – amitlicht 2010-03-12 17:34:38

+0

行是固定长度的吗? – 2010-03-12 17:44:55

回答

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()回报nullEOF达到,所以你应该检查并照顾它。

+0

这个目标不是逐行读取,因为它用冗余的字符串对象填充我的堆并使GC变得疯狂。我想从inputstreamreader中读取(使用bufferedReader/whatever),而不创建许多String对象。也许直接读入一个缓冲区(不需要在中间创建一个字符串),或者读取多行以避免字符串垃圾... – amitlicht 2010-03-12 18:03:21

+1

使用__RandomAccessFile__直接读取字节缓冲区有什么用处?整个文件(__readFull(byte [] b)__) – Jack 2010-03-12 18:42:23

+0

字符串在JVM v。1.6中非常优化。你是否使用过一个探查器并且真的发现了一个问题?或者你只是猜测? – incarnate 2010-03-12 21:29:52

0

如果你有多行分隔符,你可以使用长度和偏移量的read方法读取很多字符。否则使用一个StringBuilder来追加BufferedReader读取的每一行应该对你没有太大的临时内存