使用 DirectoryChooser 保存文件时拒绝访问

access denied while saving file using DirectoryChooser

我正在使用 Apache 库编辑 DOCX 文件,我希望用户选择保存文件的目录。 select 到哪个文件夹并不重要,它总是会发出异常并显示 "path (Access denied)"、,但是 ,如果我在我的代码中选择目录,它会完美运行。这是我的一些代码:

        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();

请帮我找出我做错了什么:(

DirectoryChooser returns 一个 File 对象,它可以是一个目录或一个空值(如果您没有通过按取消或退出对话框来选择一个)。所以为了保存你的文件,你还需要将文件名附加到你选择的目录的绝对路径上。您可以通过 :

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

但这是平台相关的原因,因为 windows 它是‘\’,对于 unix 它是‘/’,所以最好使用 File.separator,例如:

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

你可以阅读更多关于上面的内容here

编辑: 正如 Fabian 在下面的评论中提到的,您可以使用 File 构造函数,传递文件夹(您从他们那里获得的文件 DirectoryChooser )和新的文件名作为参数,使代码更具可读性:

new FileOutputStream(new File(file, "doc.docx"))