Как исправить «невозможно получить доступ к файлу, потому что он используется другим процессом»

#java

#java

Вопрос:

Я запускаю программу, которая будет вызывать код, основанный на условии.

     if (charCount >= 152) {
        new InformixToPDF().createPdflandscape( DESTINATION   
                "\"   new_file_name   "_"   df.format(new Date())   ".pdf",source);            
        }
    //function to call for portrait conversion
    else {
        new InformixToPDF().createPdfportrait( DESTINATION   
                "\"   new_file_name   "_"   df.format(new Date())   ".pdf",source);
         }
 

Здесь приведен код, который вызывается, если выполнено условие else.

   public void createPdfportrait(String dest,String source) throws DocumentException, IOException {
   File myfile = new File(source);
   Document document = new Document(PageSize.A4);

   document.setMargins (20, 0, 50, 80); 
   PdfWriter.getInstance(document, new FileOutputStream(dest));
   document.open();

   br = new BufferedReader(new FileReader(source));
   String line;
   Paragraph p;

   //PDF font configuration
   Font normal = new Font(FontFamily.COURIER, 7);
   Font bold = new Font(FontFamily.COURIER, 7, Font.BOLD);

   //add page into PDF
   boolean title = true;
       while ((line = br.readLine()) != null) {
       p = new Paragraph(line.length() == 0 ? " ": line, title ? bold : normal);
       document.add(p);
       }
       document.close();

       System.out.println("Informix4gl report file "   source   " has been converted to PDF");
       Path sourcePath = Paths.get(source);
       Path destinationPath = Paths.get(MOVE);
       try {
           Files.move(sourcePath, destinationPath,
                   StandardCopyOption.REPLACE_EXISTING);
       } catch (IOException e) {
           e.printStackTrace();
       }
    }
 

После преобразования был выполнен текущий файл. его необходимо переместить в другую папку, используя этот код, где «источник» — это текущий файл, а «ПЕРЕМЕСТИТЬ» — папка назначения.

    Path sourcePath = Paths.get(source);
   Path destinationPath = Paths.get(MOVE);
   try {
       Files.move(sourcePath, destinationPath,
               StandardCopyOption.REPLACE_EXISTING);
   } catch (IOException e) {
       e.printStackTrace();
   }
 

Коды выполняются, и pdf-файл создается успешно, но ошибка «java.nio.file.Исключение FileSystemException: O:xxyyzztest -> O:xxyyzzFOLDER C: Процесс не может получить доступ к файлу, поскольку он используется другим процессом.» появится.

Как мне исправить это и какие изменения я должен внести в код, чтобы избежать этой ошибки?

Я знаю, что этот вопрос задавали много раз, но ничто из этого не решило мою проблему. Однако, возможно, я что-то пропустил.

Комментарии:

1. Какая строка в коде вызывает исключение? вы можете отладить это.

2. Можете ли вы опубликовать полную обратную трассировку ? Это будет полезно.

3. Согласно тому, что вы опубликовали, сообщение об ошибке означает, что файл O:xxyyzzFOLDER открыт либо вашей Java-программой, либо какой-либо другой программой. Также `O:xxyyzztest — похоже, это путь к папке, а не к файлу. Вы пытаетесь переместить один файл или целую папку?

4. Я пытаюсь переместить один файл. Извините, там было лишнее » «.

5. УБЕДИТЕЛЬНОЕ ПРЕДЛОЖЕНИЕ: добавьте Thread.sleep(5000); (или что-то подобное) после document.close() и посмотрите, поможет ли это. Возможно, iText не «закрывает» файл немедленно, поэтому ваш nio.move() выдает ошибку «используемый файл», если он попытается сразу после этого.