在撰写

时间:2016-02-23 20:36:20

标签: java io filewriter

**更新---问题不是文件编写器没有关闭而是错误终止Java应用程序。我已经更新了这个问题。

我有以下类启动JAVAFX Web视图并将一些java对象暴露给Web视图的html。

public class FileSystemBridge {

private void writeToFile(String[] fileContents){

        if (content!=null){

            String fileName ="pathToFile";
            BufferedWriter fileWriter;
                for (int i =0; i<fileContents.length(); i++ ){
                    String fileContent fileContents[i]);
                    try {
                        fileName = fileName+Integer.toString(i)+".txt";
                        fileName = fileName.replaceAll("\\s","");
                        System.out.println(fileName);
                        File f= new File(filesDir+"/"+fileName);
                        f.createNewFile();
                        fileWriter = new BufferedWriter(new FileWriter(f));
                        fileWriter.write("");
                        fileWriter.write(fileContent);

                        fileWriter.flush();
                        fileWriter.close();
                    } catch (IOException e) {
                        System.out.println("in the exception!");
                        e.printStackTrace();
                    }
                }

        }
        else {
            System.out.println("no content");
        }
        System.out.println("done writing, exit app now");

    }

public void exit(){
    System.out.println("EXITING!");
    Platform.exit();
    System.exit(0);
}
}

上面的类还有其他成员类,它们充当POJOS,以显示正在读/写到“前端”html的文件结构。

我通过覆盖默认的Browser类构造函数并添加以下代码,将FileSystemBridge的实例传递给Web视图。

webEngine.getLoadWorker().stateProperty().addListener(
                (ObservableValue<? extends State> ov, State oldState, 
                    State newState) -> {

                        if (newState == State.SUCCEEDED) {
                            JSObject context= (JSObject) webEngine.executeScript("window");
                            context.setMember("fsBridge", new FileSystemBridge());
                            webEngine.executeScript("init('desktop')");//the hook into our app essentially

                        }
            });

webEngine.executeScrit(“init)基本上在我们的前端执行一些初始化。然后在用户交互的webview上执行的javascript上,我们调用FileSystemBridge写入方法并使用回调来调用FileSystemBridge的exit方法,这实质上是调用Platform.exit()。

在用户点击

App.handleWrite(contentToBeWritten, function(success){
                        if (success){
                            console.log("inside success!");
                            App.handleExit();
                        }
                    });

然后我们的handleWrite javascript函数

handleWrite: function(content, callback){
    fsBridge.callWrite(content);
    retVal = true;//more logic to this but simplified for demo
    callBack(retVal);
}

现在在FileSystemBridge.exit()方法中我添加了System.exit(0),它成功地终止了我的java实例,这是原始问题。但是我想知道这是否是处理退出的正确方法使用JAVAFX webview的Java应用程序。以这种方式使用System.exit(0)会产生无法预料的后果吗?

4 个答案:

答案 0 :(得分:3)

创建UI的Java应用程序不会终止,直到满足某些条件。对于JavaFX应用程序,make sure you are closing all Stage instances.

答案 1 :(得分:2)

如果您无法按照上一个答案将其记录到finally块中,那么尝试使用资源怎么样?像这样(你需要删除以前的fileWriter声明):

for (int i =0; i<fileContents.length(); i++ ){
                String fileContent fileContents[i]);
                try {
                    fileName = fileName+Integer.toString(i)+".txt";
                    fileName = fileName.replaceAll("\\s","");
                    System.out.println(fileName);
                    File f= new File(filesDir+"/"+fileName);
                    f.createNewFile();
                    try(BufferedWriter fileWriter = new BufferedWriter(new FileWriter(f));)
                    {

                        fileWriter.write("");
                        fileWriter.write(fileContent);
                    }
                } catch (IOException e) {
                    System.out.println("in the exception!");
                    e.printStackTrace();
                }
            }

答案 2 :(得分:1)

尝试将关闭放在如下所示的finally块中,看看它是否有任何区别。

try {
} catch (Exception e) {
} finally {
 fileWriter.close();
}

答案 3 :(得分:1)

我确实看到了一些陷阱,但没有真正的问题,尤其是当您处理异常时。 length()表示您在此处简化了代码。

在更新的路径/文件中尝试它,因为它更多&#34; atomic&#34; - 更简单。

    String fileName ="pathToFile";
    fileName = fileName.replaceAll("[\\s/\\\\]", "");
    for (int i = 0; i < fileContents.length; i++) {
        Path path = Paths.get(fileName + i + ".txt";
        byte[] bytes = ("\ufeff" + fileContents).getBytes("UTF-8");
        //Or: byte[] bytes = fileContents.getBytes();
        try {
            Files.write(path, bytes);
        } catch (IOException e) {
            System.out.println("Could not write " + path.getFileName());
        }
    }

此版本使用起始BOM char在UTF-8中写入。 BOM很难看,但允许Windows识别UTF-8。这允许特殊字符。

Files.write可以有额外的参数列表StandardOpenOptions.REPLACE_EXISTING。