如何使用java中的bufferedreader计算大文件中固定的行数

时间:2014-07-02 11:43:08

标签: java bufferedreader

我需要读取一个包含几百万行的大文件。现在,当我读取整个文件时,缓冲区变得非常沉重,有时会抛出内存异常。

所以我想要的是,例如我有10000行。我想读到1000行,处理它然后再从1001读到2000年,依此类推,直到结束。任何帮助将受到高度赞赏。

我现在做了什么

String filePath="some path";
log.debug("File name got for promo ::::::   "+filePath);
File f = new File(filePath);
int i = 0;

try {
    System.out.println("Reading the file for data::::::  ");
    BufferedReader br = new BufferedReader(new FileReader(f));
    String aLine = null;

    Runtime.getRuntime().freeMemory();
    while ((aLine = br.readLine()) != null) {
        System.out.println(aLine);
        if(aLine.trim().length()!=12)
        {
            System.out.println("Not a Valid number at line --->"+(i+1));
            continue;
        }
        //numberList.add(aLine.trim());
        i++;


    }
    Runtime.getRuntime().freeMemory();
    log.debug("Total Number/Row found in the file is  --> " + i);
}

2 个答案:

答案 0 :(得分:0)

不要将所有行存储在List或任何其他结构中,只需将它们即时处理

例如在你的情况下:

int nRows = 0;
int numbers = 0;
while ((aLine = br.readLine()) != null) {
    if(aLine.trim().length() == 12) {
        numbers++;
    }
    nRows++;
}
log.debug("Total number of rows: " + nRows);
log.debug("Total number of line of length 12: " + numbers);

答案 1 :(得分:0)

而不是使用固定缓冲区方法您可以考虑使用内存映射文件,通过FileChannels并可以使用java.nio包 - 这些应该比java.io更快,

这是链接到既有方法说明,固定缓冲区方法的文章  内存映射文件与nio:

Read a large file in chunks with fixed size buffer