这是我的app目录
----dist
+-- lib //library folder
+-- backup //folder with my database backup filename = database_file.sqlite
|__ app.jar
|__ database_file.sqlite
当我对按钮执行操作时,我想关闭数据库连接,然后将 database_file.sqlite 从备份文件夹复制(覆盖)到根文件夹( dist ) database_file.sqlite 将其加载到我的应用中。不久,我想在单击按钮时重新加载备份/原始数据库。 注意:我使用默认包 现在我有了这个代码(见下文),但我无法弄清楚如何使它有效。
private void cmd_backupActionPerformed(java.awt.event.ActionEvent evt) {
int p = JOptionPane.showConfirmDialog(null, "Do you really want to reset your data / Backup database?", "Backup", JOptionPane.YES_NO_OPTION);
if (p == 0) {
InputStream inStream = null;
OutputStream outStream = null;
try {
rs.close();
pst.close();
File afile = new File("C:\\Users\\Tzontonel\\Documents\\NetBeansProjects\\RDSS\\dist\\backup\\database_file.sqlite");
File bfile = new File("C:\\Users\\Tzontonel\\Documents\\NetBeansProjects\\RDSS\\dist\\database_file.sqlite");
System.out.println(afile.getCanonicalPath());
inStream = new FileInputStream(afile);
outStream = new FileOutputStream(bfile);
byte[] buffer = new byte[1024];
int length;
//copy the file content in bytes
while ((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
inStream.close();
outStream.close();
// delete the original file
// afile.delete();
System.out.println("File is copied successful!");
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
答案 0 :(得分:1)
类加载器不访问文件系统。它访问类路径中的资源。你不想在这里使用类加载器,而是文件IO。因此,对getResourceAsStream()
的调用没有意义(并且无论如何都要替换它返回的输入流。)
将您的课程放在一个包中,因为所有课程都应该如此。
现在,当您创建这样的文件时:
new File("database_file.sqlite")
打开当前目录中的文件。当前目录是执行java命令的目录。因此,除非您在执行程序时总是在dist
目录中,否则您将无法使用这样的相对路径打开文件。
将dist
目录的路径作为参数或系统属性传递给您的应用程序,并使用此目录作为基本目录来打开文件。
下一个问题是您同时打开输入流和输出流到同一文件。您应该打开一个InputStream到备份文件,输出流到数据库文件。