2012-06-14 2 views
1

У меня есть функция, которая копирует двоичный файлисключение во время копирования файлов в Java

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

и вторая функция

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

Вторая функция выполняется для каждого водителя, найденного в системе. Файл драйвера скопирован, и я пытаюсь инициализировать 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, ​​который предотвращает использование драйверов, хранящихся в месте, где есть "(" в пути ... и это случай, с которым я сталкиваюсь .

Я ценю вашу помощь.

+0

Благодарим всех вас за ваши комментарии. Я не хочу использовать дополнительные библиотеки, такие как apache, поскольку, наконец, этот код должен запускаться апплетом. Все остальное, что я пробовал, но кажется, что файл dest используется. Я даже попробовал отвратительное решение и перечислил драйверы (и добавил номер в имя dst-файла), но когда я запустил его с помощью файла dst-апплета, он используется, когда апплет запускается более одного раза. – norbi771

ответ

0

Если файл используется другим процессом и заблокирован, для его доступа нет общих решений. Лучше всего использовать FileLock, но это зависит от формы, прочитайте документацию, написано, что результаты являются «рекомендательными», поэтому будьте осторожны. вы также можете взглянуть на ReentrantReadWriteLock class.

1

Я бы переместить блок примерочных поймать в метод copyFile. Таким образом, вы можете правильно обращаться с закрытием 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(); 
    } 
} 

Затем вы можете удалить try-catch из метода copyDriverToSafeLocation.

1

Или это Java 7 Путь:

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

Edit: А Java 7 NIO путь.

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

Вы не закрываете() свои входные или выходные потоки. –

+1

Они не должны быть явно закрыты в java 7. Они автоматически закрываются при завершении блока try. – OldCurmudgeon

0

Я не уверен, почему проблема с одним файлом бы предотвратить копирование файла отличается. Однако, не закрывая файл при возникновении исключения, это может вызвать проблемы. Используйте try ... наконец, чтобы убедиться, что вы звоните близко к каждому открываемому файлу.

+0

Вы правы, к сожалению, наконец, не помогли – norbi771

Смежные вопросы