Я занимаюсь разработкой системы с использованием Struts 1.x
, Jsp
Servlet
и Pentaho
(генерации отчетов).файла удалять не работает - он работает только один раз, после перезагрузки сервера JBoss и в режиме отладки
Здесь, когда после создания отчета пользователь может открыть и сохранить этот файл как отлично, и это работает нормально.
Но проблема возникает при открытии файла, он создает файл в нашей временной папке jboss, который не удаляется, - вот в чем проблема.
Мы удаляем файл с уровня кода, и мы понимаем, что после повторного завершения работы сервера после первого раза он удаляется, а другой - при отладке, он удаляется каждый раз.
public Object process() throws RenderException, IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// properties for XSSF
File xmlFile = null;
File templateFile = null;
Writer xmlWriter = null;
boolean isXLSX = false;
timeStamp = Calendar.getInstance().getTimeInMillis();
try {
OutputType outputType = rendererAttrList.getOutputType();
Frame[] frameList = xmlDef.getShownFrames(renderDocs);
if (frameList != null) {
// ==============================================TPID#65448 code
// add========================================
boolean isPentahoExcel = false;
Frame t_CurrFrame = frameList[0];
if (t_CurrFrame != null) {
FrameType frameType = t_CurrFrame.getFrameType();
if (frameType == FrameType.FRAME_TYPE_EXTERNAL) {
isPentahoExcel = true;
}
}
// ==============================================TPID#65448 code end========================================
isXLSX = isXLSXOutput(frameList);
// native excel support and if the output is not supported by
// .xls, change the output to .xlsx
if (((outputType == OutputType.NATIVE_EXCEL2007) || ((outputType == OutputType.NATIVE_EXCEL97) && isXLSX))&&!isPentahoExcel)
{
workbook = new XSSFWorkbook();
rendererAttrList.setOutputType(OutputType.NATIVE_EXCEL2007);
xmlFile = File.createTempFile(getXmlDef().getName()
+ timeStamp, ".xml");
logger.info("XML File location :"
+ xmlFile.getAbsolutePath());
xmlWriter = new OutputStreamWriter(new FileOutputStream(
xmlFile), "UTF-8");
spreadSheetWriter = new SpreadsheetWriter(xmlWriter);
spreadSheetWriter.beginSheet();
} else {
workbook = new HSSFWorkbook();
}
dataFormat = workbook.createDataFormat();
sheet = workbook.createSheet("Report");
logger.debug("Start rendering the excel output in "
+ rendererAttrList.getOutputType() + " format ");
renderOutput();
logger.debug("Stop rendering the excel output ");
if (workbook instanceof HSSFWorkbook) {
// ==============================================TPID#65448 code add========================================
if (isPentahoExcel) {
renderExternalXLSX(t_CurrFrame,byteArrayOutputStream);
} else {
autoSizeColumn();
// write the excel to output
workbook.write(byteArrayOutputStream);
}
// ==============================================TPID#65448 code end========================================
} else {
// 1. generate data in XML format
spreadSheetWriter.endSheet();
// close the xml stream before we substitute in xlsx file
try {
if (xmlWriter != null)
xmlWriter.close();
xmlWriter = null;
} catch (Exception ex) {
logger.error("Error while closing xmlWriter for file "
+ xmlFile.getName());
}
// Step 2. create template from the excel workbook
String sheetRef = ((XSSFSheet) sheet).getPackagePart()
.getPartName().getName();
templateFile = createTemplate();
ByteArrayOutputStream xlsxOutput = new ByteArrayOutputStream();
// Step 3. Substitute the template entry with the generated
// data
substitute(templateFile, xmlFile, sheetRef.substring(1),
xlsxOutput);
// if the data is too large don't try to auto size the
// columns
// may result into out of memory exception
if (!isXLSX) {
// autosize the columns
InputStream inp = new ByteArrayInputStream(
xlsxOutput.toByteArray());
workbook = WorkbookFactory.create(inp);
sheet = workbook.getSheetAt(0);
autoSizeColumn();
if (xlsxOutput != null)
xlsxOutput.close();
byteArrayOutputStream = new ByteArrayOutputStream();
workbook.write(byteArrayOutputStream);
inp.close();
xlsxOutput.close();
} else {
byteArrayOutputStream = xlsxOutput;
}
}
}
} catch (Exception de) {
logger.error(de.getMessage(), de);
throw new RenderException(de.getMessage());
} finally {
try {
if (xmlWriter != null)
xmlWriter.close();
if (xmlFile != null)
xmlFile.delete();
if (templateFile != null){
templateFile.delete();
}
} catch (Exception ex) {
logger.error("Error while closing xmlWriter for file "
+ xmlFile.getName());
}
}
return byteArrayOutputStream;
}
Резюме мой вопрос - когда Jboss
перезапуском тогда первый раз и при отладке, временно созданный файл (папка Temp) успешно удалить.
но когда она работает нормально не удалить файл
, но каждый раз, когда он звонит конкретную проблему на уровень коды, почему он не выполняет.
templateFile.delete();
Большое спасибо ...
Привет, я попробовал deleteIfExists(), но это не сработало. И я проверяю, что происходит, когда мы вызываем delete() methods.it - это передать false.i cant полагать, что когда я отлаживаю его, true и fill - delting.why? Большое вам спасибо – Zcon
@ user2991030 - и вы не видите Java Exception в журналах сервера? –