2011-09-14 4 views
8

Usando i seguenti documenti: http://poi.apache.org/spreadsheet/how-to.html#sxssfPOI Apache - SXSSF: a dove scorre le righe non presenti nella finestra prima dell'output su file?

Secondo questo sito:

SXSSF (pacchetto: org.apache.poi.xssf.streaming) è un'estensione di streaming API-compatibile XSSF da utilizzare quando devono essere prodotti fogli di calcolo molto grandi e lo spazio disponibile è limitato. SXSSF raggiunge il suo basso ingombro di memoria limitando l'accesso alle righe che si trovano all'interno di una finestra scorrevole, mentre XSSF dà accesso a tutte le righe del documento. Le vecchie file che non sono più nella finestra diventano inaccessibili, così come sono scritte sul disco.

Tuttavia, nell'esempio fornito lo svuotamento avviene prima che alla cartella di lavoro venga indicato il percorso del file in cui scrivere il file.

public static void main(String[] args) throws Throwable { 
    Workbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk 
    Sheet sh = wb.createSheet(); 
    for(int rownum = 0; rownum < 1000; rownum++){ 
     Row row = sh.createRow(rownum); 
     for(int cellnum = 0; cellnum < 10; cellnum++){ 
      Cell cell = row.createCell(cellnum); 
      String address = new CellReference(cell).formatAsString(); 
      cell.setCellValue(address); 
     } 

    } 

    // Rows with rownum < 900 are flushed and not accessible 
    for(int rownum = 0; rownum < 900; rownum++){ 
     Assert.assertNull(sh.getRow(rownum)); 
    } 

    // ther last 100 rows are still in memory 
    for(int rownum = 900; rownum < 1000; rownum++){ 
     Assert.assertNotNull(sh.getRow(rownum)); 
    } 

    FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx"); 
    wb.write(out); 
    out.close(); 
} 

Quindi questo fa sorgere la domanda, dove sul file system sta memorizzando i dati? Sta solo creando un file temporaneo nella directory temporanea predefinita? È sicuro per tutte/molte implementazioni?

Grazie

risposta

9

La classe che fa il buffer è SheetDataWriter in org.apache.poi.xssf.streaming.SXSSFSheet

La linea magica probabilmente siete interessati a è:

_fd = File.createTempFile("poi-sxxsf-sheet", ".xml"); 

In termini di sicurezza è che, probabilmente, ma non certamente ... Probabilmente vale la pena aprire un bug nel poi bugzilla, e chiedendo di passare a org.apache.poi.util.TempFile che consente un po 'più di controllo. In generale però, finché si specifica una proprietà valida per java.io.tmpdir (o l'impostazione predefinita è ragionevole per voi) si dovrebbe andare bene

+0

Grande! Grazie .. –

+0

Grazie per la risposta. Quando il file temporaneo viene cancellato? sarà cancellato nella chiusura del programma? come possiamo eliminarlo manualmente? – user2625094

+0

Classe SXSSFWorkbook dispose() - Eliminare i file temporanei che supportano questa cartella di lavoro su disco. –