【问题标题】:Copy a file to the Relative path of myClass将文件复制到 myClass 的相对路径
【发布时间】:2012-08-07 10:01:07
【问题描述】:

这是我的应用目录

----dist
       +-- lib //library folder
       +-- backup //folder with my database backup filename = database_file.sqlite
       |__ app.jar
       |__ database_file.sqlite

当我对按钮执行操作时,我想关闭数据库连接,然后将 database_file.sqlitebackup 文件夹复制(覆盖)到根文件夹(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);
            }


        }
}

【问题讨论】:

  • 您遇到了什么问题?
  • java.io.FileNotFoundException: database_file.sqlite(The system cannot find the file specified) 我还将OutputStream 修改为null。问题在于路径(相对路径)。我不想通过绝对路径让它变得困难,它可以工作,我想要相对于不同操作系统、系统的迁移。感谢您的宝贵时间。
  • 您是否真的需要重新初始化文件,因为 inStream 已经正确分配了备份流?

标签: java file inputstream relative-path


【解决方案1】:

类加载器不访问文件系统。它访问类路径中的资源。您不想在这里使用类加载器,而是文件 IO.所以对getResourceAsStream() 的调用没有意义(无论如何,你将它返回的输入流替换为另一个)。

将您的课程放在一个包中,就像所有课程一样。

现在,当您创建这样的文件时:

new File("database_file.sqlite")

您打开了当前目录中的文件。当前目录是执行java命令的目录。因此,除非您在执行程序时始终位于dist 目录中,否则您将无法使用这样的相对路径打开文件。

dist 目录的路径作为参数或系统属性传递给您的应用程序,并将此目录用作打开文件的基本目录。

下一个问题是您同时打开同一个文件的输入流和输出流。您应该打开备份文件的输入流,以及数据库文件的输出流。

【讨论】:

  • 查看更新的问题,使用绝对路径可以正常工作,但我想让它相对以避免可移植性错误(系统找不到指定的文件)。所以它适用于: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");
  • 查看我的原始答案:将根目录作为参数传递给您的程序。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2022-10-17
相关资源
最近更新 更多