अपाचे पीओआई 3.8 (उस समय नवीनतम स्थिर) प्रत्येक शीट के लिए एक अस्थायी एक्सएमएल फ़ाइल बनाता है (एसएक्सएसएसएफ का उपयोग करते समय) लेकिन इन फ़ाइलों को हटाने का विकल्प नहीं देता है। यह तथ्य इस एपीआई को उपयोग करने के लिए अच्छा नहीं बनाता है क्योंकि अगर मैं 600 एमबी डेटा निर्यात कर रहा हूं तो मेरे पास 600 एमबी के साथ 2 फाइलें होंगी और उनमें से एक अस्थायी फ़ोल्डर में तब तक हटा दी जाएगी जब तक इसे हटाया नहीं जाता है।
कोड में खोदने पर, हम देखते हैं कि SXSSFSheet
में SheetDataWriter
का उदाहरण है। यह अंतिम वर्ग File
उदाहरण द्वारा प्रदर्शित अस्थायी फ़ाइल को लिखने और बनाए रखने के लिए ज़िम्मेदार है। इस ऑब्जेक्ट को एक्सेस करने से फ़ाइल को मिटाने की अनुमति मिल जाएगी। ये सभी उदाहरण निजी हैं, सैद्धांतिक रूप से, आप उन्हें एक्सेस नहीं कर सकते हैं। हालांकि, प्रतिबिंब के माध्यम से, हम इस उपयोगी लेकिन कष्टप्रद फ़ाइलों को हटाने के लिए File
उदाहरण तक पहुंच सकते हैं!
निम्नलिखित विधियों को ऐसा करने की अनुमति है। deleteSXSSFTempFiles
पर कॉल करके, उस कार्यपुस्तिका की सभी अस्थायी फ़ाइलें हटा दी जाती हैं।
/**
* Returns a private attribute of a class
* @param containingClass The class that contains the private attribute to retrieve
* @param fieldToGet The name of the attribute to get
* @return The private attribute
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static Object getPrivateAttribute(Object containingClass, String fieldToGet) throws NoSuchFieldException, IllegalAccessException {
//get the field of the containingClass instance
Field declaredField = containingClass.getClass().getDeclaredField(fieldToGet);
//set it as accessible
declaredField.setAccessible(true);
//access it
Object get = declaredField.get(containingClass);
//return it!
return get;
}
/**
* Deletes all temporary files of the SXSSFWorkbook instance
* @param workbook
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static void deleteSXSSFTempFiles(SXSSFWorkbook workbook) throws NoSuchFieldException, IllegalAccessException {
int numberOfSheets = workbook.getNumberOfSheets();
//iterate through all sheets (each sheet as a temp file)
for (int i = 0; i < numberOfSheets; i++) {
Sheet sheetAt = workbook.getSheetAt(i);
//delete only if the sheet is written by stream
if (sheetAt instanceof SXSSFSheet) {
SheetDataWriter sdw = (SheetDataWriter) getPrivateAttribute(sheetAt, "_writer");
File f = (File) getPrivateAttribute(sdw, "_fd");
try {
f.delete();
} catch (Exception ex) {
//could not delete the file
}
}
}
}
स्रोत
2012-10-04 10:05:32
क्यों SVN से पूरे codebase चेकआउट और निर्माण कि चींटी के साथ नहीं? या हाल ही में एक रात का निर्माण पकड़ो? – Gagravarr
@Gagravarr वर्तमान संस्करण 3.9-बीटा 1 है और मैं वास्तव में वास्तव में costumers के लिए बीटा एपीआई का उपयोग करना टालना चाहता था ... –
यदि आप नई सुविधाओं का उपयोग करना चाहते हैं, तो आपको नई रिलीज का उपयोग करने की आवश्यकता है ... – Gagravarr