**更新---问题不是文件编写器没有关闭而是错误终止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)会产生无法预料的后果吗?
答案 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。