2016-01-21 2 views
0

Я занимаюсь разработкой системы с использованием Struts 1.x, JspServlet и 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(); 

Большое спасибо ...

ответ

0

Что происходит, когда метод delete называется? Вы можете записать результат метода «удалить», чтобы увидеть результат. Это должно быть true или false. Вызывает ли это исключение? Метод delete может вызывать SecurityException, указывая на то, что вам отказано в доступе к удалению файла.

В общем, первое, что нужно сделать, это попытаться понять, почему файл не удаляется с помощью набора инструментов, предоставленного вам этой конкретной функцией.

Другой подход может заключаться также в вызове метода deleteIfExists. См. Здесь: https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#deleteIfExists-java.nio.file.Path-

+0

Привет, я попробовал deleteIfExists(), но это не сработало. И я проверяю, что происходит, когда мы вызываем delete() methods.it - ​​это передать false.i cant полагать, что когда я отлаживаю его, true и fill - delting.why? Большое вам спасибо – Zcon

+0

@ user2991030 - и вы не видите Java Exception в журналах сервера? –