我有以下静态方法打印从40.000行.xls电子表格导入的数据。
现在,在控制台中打印数据大约需要27秒,内存消耗量很大。
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
public static void printSheetData(List<List<HSSFCell>> sheetData) {
for (int i = 0; i < sheetData.size(); i++) {
List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
for (int j = 0; j < list.size(); j++) {
HSSFCell cell = (HSSFCell) list.get(j);
System.out.print(cell.toString());
if (j < list.size() - 1) {
System.out.print(", ");
}
}
System.out.println("");
}
}
免责声明:我知道,我知道大数据属于数据库,不在控制台中打印输出,过早优化是所有邪恶的根源......
答案 0 :(得分:2)
您是否尝试使用StringBuilder创建大型字符串,然后一次性打印,或者在添加了这么多行之后,而不是一次打印出每一行?您将使用StringBuilder作为一种缓冲区。
如,
public static void printSheetData(List<List<HSSFCell>> sheetData) {
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < sheetData.size(); i++) {
List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
for (int j = 0; j < list.size(); j++) {
HSSFCell cell = (HSSFCell) list.get(j);
// System.out.print(cell.toString());
strBuilder.append(cell.toString());
if (j < list.size() - 1) {
// System.out.print(", ");
strBuilder.append(", ");
}
}
// System.out.println("");
strBuilder.append("\n");
// consider testing strBuilder size here and printing it out if
// it is greater than some pre-set, then re-initializing the
// strBuilder variable.
}
System.out.println(strBuilder.toString());
}
答案 1 :(得分:0)
尝试log4j。它会为你缓冲。 此外,不是将整个电子表格加载到内存中,而是可以在阅读时进行打印吗?