0

これは私のアプリディレクトリです

----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);
            }


        }
}
4

1 に答える 1

1

クラスローダーはファイルシステムにアクセスしません。クラスパスにあるリソースにアクセスします。ここではクラスローダーを使用したくありませんが、ファイル IO. したがって、への呼び出しgetResourceAsStream()は意味がありません (そして、それが返す入力ストリームを別のものに置き換えます)。

すべてのクラスがそうであるように、クラスをパッケージに入れます。

ここで、次のようなファイルを作成すると:

new File("database_file.sqlite")

現在のディレクトリにあるファイルを開きます。また、現在のディレクトリは、java コマンドが実行されるディレクトリです。distしたがって、プログラムを実行するときに常にディレクトリにいない限り、そのような相対パスを使用してファイルを開くことはできません。

ディレクトリのパスをdist引数またはシステム プロパティとしてアプリケーションに渡し、このディレクトリをベース ディレクトリとして使用してファイルを開きます。

次の問題は、入力ストリームと出力ストリームを同じファイルに同時に開くことです。バックアップ ファイルへの InputStream と、データベース ファイルへの出力ストリームを開く必要があります。

于 2012-08-07T10:28:23.483 に答える