#java #apache-poi
#java #apache-poi
Вопрос:
Я просто хочу использовать свой собственный SheetDataWriter для перезаписи приведенного ниже метода
/**
* Override this to translate (such as decrypt or expand) the file input stream
* as it is being read from disk.
* The default behavior is to to pass the stream through unmodified.
*
* @param fis the stream to decorate
* @return a decorated stream
* @throws IOException
* @see #decorateOutputStream(FileOutputStream)
*/
protected InputStream decorateInputStream(FileInputStream fis) throws IOException {
return fis;
}
потому что я хочу заменить этот метод при установке compress: true
@Override
//GZIPInputStream default cache byte size is 512b
protected InputStream decorateInputStream(FileInputStream fis) throws IOException {
return new GZIPInputStream(fis);
}
почему я хочу заменить это? Потому что я хочу выяснить, является ли размер кэша основной причиной замедления скорости записи из poi-sxssf-sheet???.gz чтобы poi-sxssf-template???.xlsx при высоком уровне совпадения (apache jmeter: 50 пользователей, 6 циклов, объем оперативной памяти 20).
Но вопрос в том, как использовать мой собственный SheetDataWriter при инициализации SXSSFWorkbook?
Ответ №1:
Вы спрашиваете, как переопределить методы в Java
? Кажется, это очень простой вопрос.
У вас может быть свой собственный SXSSFWorkbook
класс, который расширяет default SXSSFWorkbook
и переопределяет protected SheetDataWriter createSheetDataWriter()
. Там, если это сжатые временные файлы, вы можете вернуть расширенный GZIPSheetDataWriter
, который переопределяет protected InputStream decorateInputStream(FileInputStream fis)
.
Полный рабочий пример:
import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.*;
import java.util.zip.GZIPInputStream;
class OverrideSXSSFWorkbook {
public static void main(String[] args) throws Exception {
try (
SXSSFWorkbook workbook = new MySXSSFWorkbook(); FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {
workbook.setCompressTempFiles(true);
Sheet sheet = workbook.createSheet();
Row row;
Cell cell;
row = sheet.createRow(0);
cell = row.createCell(0);
cell.setCellValue("CellValue");
workbook.write(fileout);
workbook.close();
workbook.dispose();
}
}
}
class MySXSSFWorkbook extends SXSSFWorkbook {
@Override
protected SheetDataWriter createSheetDataWriter() throws IOException {
if(isCompressTempFiles()) {
System.out.println("GZIPSheetDataWriter");
//return new GZIPSheetDataWriter(getSharedStringSource());
return new GZIPSheetDataWriter(getSharedStringSource()) {
@Override
protected InputStream decorateInputStream(FileInputStream fis) throws IOException {
System.out.println("overridden decorateInputStream");
return new GZIPInputStream(fis);
}
};
}
System.out.println("default SheetDataWriter");
return new SheetDataWriter(getSharedStringSource());
}
}
Комментарии:
1. так мило с вашей стороны. Это действительно основной вопрос Java, виню себя в том, что я не внимательно прочитал код poi.