我意识到有很多线索涉及这个话题,但到目前为止我发现的所有内容都未能完成工作,所以我认为我必须遗漏一些东西。
我有一段代码,允许用户从列表中选择一个名称。这些名称是从名为users.ldf的加密文件加载的(加密文件格式仅由我的软件使用)。一旦用户选择了一个名字,他们就会按下一个按钮,触发这部分代码。代码应该遍历文件,将每行复制到新文件,除了选择的文件,删除旧文件,然后将新文件重命名为旧文件的同名删除,从而从列表中删除名称。但是,永远不会删除旧文件,并且永远不会重命名新文件。这是代码:
private void delUserBtnActionPerformed(java.awt.event.ActionEvent evt) {
String user = lm.getElementAt(userList.getSelectedIndex()).toString();
try {
Encryption e = new Encryption();
File oldfile = new File("libs/users.ldf");
File newfile = new File("libs/temp.ldf");
PrintWriter writer = new PrintWriter(new FileWriter(newfile, false));
Scanner scanner = new Scanner(oldfile);
while (scanner.hasNextLine()) {
String lineFromFile = scanner.nextLine();
String line = e.decrypt(lineFromFile);
if (!line.contains(user)) {
writer.write(e.encrypt(line));
System.out.println("Keeping user " + line);
} else {
System.out.println("Erasing user " + line);
}
}
try {
writer.flush();
writer.close();
scanner.close();
System.gc();
} catch (Exception exc) {
exc.printStackTrace();
}
oldfile.delete();
newfile.renameTo(new File("libs/users.ldf"));
lm.clear();
JOptionPane.showMessageDialog(null, "User " + user + " removed!");
} catch (FileNotFoundException ex) {
Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(EditUsers.class.getName()).log(Level.SEVERE, null, ex);
}
}
我试过了:
删除前设置oldfile.setWritable(true)
使用BufferedWriter而不是PrintWriter以及FileOutputStream。
运行垃圾收集器。
程序中任何位置的文件的所有其他实例都将被关闭并刷新。
我已经尝试将flush和close部分放在finally
块中,但即使我写了......
finally {
try {
//Flush, close, System.gc etc....
} catch (IOException exc) {
}
NetBeans突出显示错误,并说finally without try
。
这些都没有奏效。即使添加了try / catch,也没有抛出异常,并且代码执行就像它已正常工作一样,但文件保持不变。
我应该提一下,我还用以下代码运行代码:
ProcessBuilder pb = new ProcessBuilder("del", oldfile");
Process p = pb.start();
p.waitFor();
导致异常“无法找到指定的文件”。我检查并仔细检查了文件路径,文件已经准备好,所以位置是预期的。 有关信息,Encryption类只接收一个字符串,对其进行加密并返回加密的字符串,因此不包含该文件的实例。
我可以使用其他方法来删除此文件吗?
我正在运行Win10,NetBeans 8.0.2和最新版本的JDK。 非常感谢,
答案 0 :(得分:0)
好的,所以我能想到的最好的是一个难看的修复,并且远非完美。
我现在还在编写一个批处理文件,删除并重命名相关文件,并使用ProcessBuilder
执行该文件。它有效,除非存在文件权限问题。