通过分页显示20,000条记录

时间:2014-07-17 09:35:37

标签: java jsp servlets pagination opencsv

我需要读取包含20,000条记录的CSV文件。我无法立即将所有这些记录放入列表中。我们没有使用任何数据库。我们正在通过openCSV框架阅读CSV。 请告诉我一些方法,以便我可以阅读csv part wise part并将列表发送给Servlet进行分页。这是我开始实现分页但不起作用的代码示例。

private void viewRecords(List<CSVBean> generated)
    {
        int page = 1;
        int recordsPerPage = 100;
        int offset = (page - 1) * recordsPerPage;
        System.out.println("offset:"+offset);
        System.out.println("recordsPerPage:"+recordsPerPage);

        for(int i= offset;i<recordsPerPage;i++)
        {
            CSVBean csvBean = generated.get(i);
            System.out.println(csvBean.getAttr1());
            System.out.println(csvBean.getAttr2());
            System.out.println(csvBean.getAttr3());
            System.out.println(csvBean.getAttr4());
            System.out.println(csvBean.getAttr5());
        }
    }

2 个答案:

答案 0 :(得分:1)

假设有一个变量totalRecords,您可以在其中存储记录的数量。

所以,计算总页数qty

int totalPages = (int) (totalRecords / recordsPerPage);
if (totalRecords % recordsPerPage > 0) {
        totalPages++; // increase totalPages if there's a division remainder
}

向客户发送totalPages信息以表示

等信息
page 1 of 199

其中199totalPages

现在,计算第一个记录号:

final int firstRecordNumber = (pageNumber - 1) * recordsPerPage + 1;

检查,请求的页码是否正确:

if (firstRecordNumber > totalRecords) {
    // incorrect page number requested, throw exception, process error, etc
}

因此,现在迭代记录,从firstRecordNumber开始并将它们打印到输出。添加一个新变量,例如

int printedRecords = 0;

并在循环中增加它。像那样:

String oneRecord = getRecord(firstRecordNumber);    
while ( (null != oneRecord) && (printedRecords < recordsPerPage) ) {
    printedRecords++;

    // print information to output here

    oneRecord = getNextRecord();
}

答案 1 :(得分:0)

绝对不要使用接受List<CSVBean>的方法。您必须使用CSVReader#readNext()方法逐个读取CSV行,而不存储前一行是内存。您必须跳过属于前一页的所有行,然后从相应的行构建响应。这当然会产生O(n)开销,其中n是属于先前页面的行数。使用opencsv无法解决这个问题。