доступ запрещен при сохранении файла с помощью DirectoryChooser

Я использую библиотеки Apache для редактирования файла DOCX и хочу, чтобы пользователь выбрал каталог, в котором нужно сохранить его файл. Неважно, какую папку выбрать, она всегда вызывает исключение и говорит «путь (доступ запрещен)», однако, если я выбираю каталог в своем коде, он работает отлично. Вот часть моего кода:

        XWPFDocument doc = null;
        try {
            doc = new XWPFDocument(new ByteArrayInputStream(byteData));
        } catch (IOException e) {
            e.printStackTrace();
        }

        /* editing docx file somehow (a lot of useless code) */

        Alert alert = new Alert(Alert.AlertType.INFORMATION);

        DirectoryChooser dirChooser = new DirectoryChooser();
        dirChooser.setTitle("Choose folder");
        Stage stage = (Stage) (((Node) event.getSource()).getScene().getWindow());
        File file = dirChooser.showDialog(stage);
        if (file != null) {
            try {
                doc.write(new FileOutputStream(file.getAbsoluteFile()));
                alert.setContentText("Saved to folder " +  file.getAbsolutePath());
            } catch (IOException e) {
                alert.setContentText(e.getLocalizedMessage());
            }
        } else {
            try {
                doc.write(new FileOutputStream("C://output.docx"));
                alert.setContentText("Saved to folder C:\\");
            } catch (IOException e) {
                alert.setContentText(e.getLocalizedMessage());
            }
        }
        alert.showAndWait();

Помогите, пожалуйста, понять, что я делаю не так :(


person Vasyl Butov    schedule 14.06.2018    source источник
comment
Вы выбираете каталог для сохранения файла и пытаетесь заменить этот каталог своим файлом. Вместо этого просто сохраните файл как doc.write(new FileOutputStream(file.getAbsoluteFile()+"\\EditedDoc.docx"));   -  person JKostikiadis    schedule 14.06.2018
comment
Также в будущем попытайтесь указать сообщение об ошибке в своем ответе, потому что это очень помогает. Наконец, в качестве совета попробуйте использовать System.out.println() для отладки кода, например, распечатайте file.getAbsoluteFile() и проверьте, что вы получите.   -  person JKostikiadis    schedule 14.06.2018
comment
@JKostikiadis большое спасибо! Программирование в течение 8 часов делает меня таким слепым. Спасибо и за совет. Хорошего дня, сэр.   -  person Vasyl Butov    schedule 14.06.2018


Ответы (1)


DirectoryChooser возвращает объект File, который является либо каталогом, либо нулевым значением (если вы не выбрали его, нажав кнопку отмены или выйдя из диалогового окна). Поэтому, чтобы сохранить файл, вам также необходимо добавить имя файла к абсолютному пути к выбранному вами каталогу. Вы можете сделать это:

doc.write(new FileOutputStream(file.getAbsoluteFile()+"\\doc.docx"));

Но это зависит от платформы, потому что для Windows это «\», а для Unix это «/», поэтому лучше использовать File.separator, например:

doc.write(new FileOutputStream(file.getAbsoluteFile()+File.separator+"doc.docx"));

Вы можете прочитать больше о приведенном выше здесь

Редактировать: Как Фабиан упоминал в комментариях ниже, вы можете использовать конструктор File, передав папку (файл, который вы получили от них DirectoryChooser) и новое имя файла в качестве параметров, что делает код более читаемым:

new FileOutputStream(new File(file, "doc.docx"))
person JKostikiadis    schedule 14.06.2018
comment
Я рекомендую использовать конструктор файлов, чтобы избавиться от разделителя: new FileOutputStream(new File(file, "doc.docx")) - person fabian; 15.06.2018
comment
@fabian действительно лучше и делает код более читаемым, я отредактирую свой ответ завтра, потому что сейчас не могу. - person JKostikiadis; 15.06.2018