Почему мое приложение не выпускает файлы в .close (), чтобы их можно было удалить? - PullRequest
2 голосов
/ 18 июня 2019

Моя проблема заключается в том, что во время импорта XML-текста текстовых данных в мое приложение (javafx) через файл OutputStream байтов из XML создаются файлы, хранящиеся в папке «temp», сбрасываются и закрываются, но они не может быть удалено, если приложение не закрыто.

Это довольно простой код удаления. Я делаю .flush () и .close () файлы после создания. Они не открыты, просто созданы. Приложение перейдет в папку «temp» и удалит все файлы внутри. Код удаления работает в независимом тестировании, но не во время работы приложения. Я думаю, что код удаления в порядке, проблема заключается в получении файлов для выпуска. Я исследовал, что правильно создаю и закрываю файл (ы), и удаление кода кажется достаточно простым Поэтому я не уверен, почему они до сих пор не выпущены для удаления.

Этот код создает файлы и записывает их в папку «temp». Это массив для каждого имени файла и строка данных файла, преобразованная в байты, которая создает файл (ы):

        String[] ary = f.split("\\*", 2);
        OutputStream os = null;
        try {
            String filePath = GlobalVariables.TEMP + ary[0];
            byte[] bytes = ary[1].getBytes();
            os = new FileOutputStream(new File(filePath));
            os.write(Base64.getDecoder().decode(bytes));
            os.flush();
            os.close();
            files.add(new NoteFile(ary[0], filePath));
        } catch(IOException io) {
            io.printStackTrace();
        } finally {
            try {
                if(os != null) os.close();
                System.gc();
            } catch(IOException io){
                LoggerWrapper.getInstance().myLogger.fine("ResearchController.loadImportedDataToDB cannot release files");
            }
        }

Этот код «пытается» удалить файлы, содержащиеся в папке «temp» во время очистки, если в XML-файле были файлы.

if(n.containsKey("File")){
    File file = new File(GlobalVariables.TEMP);
    String[] myFiles;
    if(file.isDirectory()){
        myFiles = file.list();
        for (String s : myFiles) {
            File myFile = new File(file, s);
            myFile.delete();
        }
    }
}

Цель состоит в том, чтобы иметь возможность обмениваться информацией и файлами между пользователями этого приложения. Итак, файлы импортируются / экспортируются через XML с использованием Base64. При импорте файлы создаются и закрываются - и по усмотрению пользователя прикрепляются и сохраняются в виде байтовых данных в базе данных. После того, как файлы сохранены в базе данных, приложение должно очистить (удалить) файлы, хранящиеся в папке «temp», независимо от того.

1 Ответ

0 голосов
/ 08 июля 2019

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

Фактическая причина была во время записи и потоковой передачи файлов байтовых данных в базу данных, поток файлов не был закрыт после завершения.После закрытия Файлового потока (fis) проблема была решена.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for(int readNum; (readNum=fis.read(buf))!=-1;)
     bos.write(buf,0,readNum);
fis.close();                  // This was the missing code which corrected my issue.
return bos.toByteArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...