1

バイナリファイルをコピーする機能があります

    public static void copyFile(String Src, String Dst) throws FileNotFoundException, IOException {
    File f1 = new File(Src);
    File f2 = new File(Dst);
    FileInputStream in = new FileInputStream(f1);

    FileOutputStream out = new FileOutputStream(f2);

    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

そして2番目の機能

    private String copyDriverToSafeLocation(String driverPath) {
    String safeDir = System.getProperty("user.home");
    String safeLocation = safeDir + "\\my_pkcs11tmp.dll";
    try {
        Utils.copyFile(driverPath, safeLocation);
        return safeLocation;
    } catch (Exception ex) {
        System.out.println("Exception occured while copying driver: " + ex);
        return null;
    }
}

2番目の関数は、システムで見つかったすべてのドライバーに対して実行されます。ドライバーファイルがコピーされ、そのドライバーでPKCS11を初期化しようとしています。初期化に失敗した場合は、次のドライバーに移動し、それをtmpの場所などにコピーします。

初期化はtry/catchブロックにあります。最初の失敗後、次のドライバーを標準の場所にコピーできなくなりました。

例外が発生します

Exception occured while copying driver: java.io.FileNotFoundException: C:\Users\Norbert\my_pkcs11tmp.dll (The process cannot access the file because it is being used by another process)

どうすれば例外を回避し、ドライバーファイルを安全にコピーできますか?

なぜ私がドライバーをコピーしようとしているのか不思議な人のために...PKCS11には厄介なBUGがあり、パスに「(」が含まれる場所に格納されているドライバーを使用できません...これは私が直面しているケースです。

よろしくお願いします。

4

5 に答える 5

1

try-catchブロックをcopyFileメソッドに移動します。そうすれば、sを閉じることを適切に処理できますInputStream(これにより、JVMがファイルハンドルを保持している可能性があります)。このようなもの:

public static void copyFile(String Src, String Dst) {
    try {
        File f1 = new File(Src);
        File f2 = new File(Dst);
        FileInputStream in = new FileInputStream(f1);

        FileOutputStream out = new FileOutputStream(f2);

        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
    }
    catch(Exception e) {
        System.out.println("Exception occured while copying driver: " + ex);
    }
    finally {
        in.close();
        out.close();
    }
}

copyDriverToSafeLocation次に、メソッドからtry-catchを削除できます。

于 2012-06-14T15:20:19.620 に答える
1

または、Java7Wayがあります。

public static void copyFile(String src, String dst) throws FileNotFoundException, IOException {
  try (FileInputStream in = new FileInputStream(new File(src))) {
    try (FileOutputStream out = new FileOutputStream(new File(dst))) {
      byte[] buf = new byte[1024];
      int len;
      while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
      }
    }
  }
}

編集:そしてJava7NIOの方法。

public static void copyFile(String src, String dst) throws FileNotFoundException, IOException {
  copyFile(new File(src), new File(dst));
}

public static void copyFile(File src, File dst) throws FileNotFoundException, IOException {
  try (FileInputStream in = new FileInputStream(src)) {
    try (FileOutputStream out = new FileOutputStream(dst)) {
      copyFile(in, out);
    }
  }
}

public static void copyFile(FileInputStream in, FileOutputStream out) throws IOException {
  FileChannel cin = in.getChannel();
  FileChannel cout = out.getChannel();
  cin.transferTo(0, cin.size(), cout);
}
于 2012-06-14T15:28:18.947 に答える
0

あるファイルに問題があると、別のファイルをコピーできなくなる理由がわかりません。ただし、例外が発生したときにファイルを閉じないと、間違いなく問題が発生する可能性があります。try ... finalを使用して、開くすべてのファイルでcloseを呼び出すようにします。

于 2012-06-14T15:29:39.410 に答える
0

Apache Commons IOとそのFileUtils.copyFile()ルーチンを使用することを選択します。

Javaでファイルをコピーするための標準的な簡潔な方法は?

于 2012-06-14T15:23:30.663 に答える
0

ファイルが他のプロセスによって使用されてロックされている場合、そのファイルにアクセスできる一般的なソリューションはありません。FileLockを使用するのが最善のチャンスですが、プレートフォームに依存します。ドキュメントを読んでください。結果は「アドバイス」であると書かれているので、注意してください。ReentrantReadWriteLockクラスも確認できます。

于 2012-06-14T15:39:07.957 に答える