java - information - Copiando un archivo usando FileUtils.copyFile
move file java (3)
Estoy tratando de copiar archivos usando el método file file copy. Estoy llegando a algunos problemas donde algunas veces se lanza una excepción
java.io.IOException: Failed to copy full contents from ''path.xml'' to localfile.xml
He buscado en Google y he visto en el código que esta excepción se lanza cuando la longitud del archivo de destino es diferente a la longitud del archivo de destino. La excepción solo se produce algunas veces, esto podría deberse al hecho de que el archivo que intento copiar es consistente. actualizando para que pueda verlo a mitad de la actualización (solo un archivo xml con cambios de valores)
Si envuelvo la llamada en un if(target.canRead())
pero esto parece hacer poca diferencia.
¿Alguien puede ayudar?
* update: * No puedo bloquear el archivo mientras se está escribiendo a través de un proveedor externo, esto causaría todo tipo de problemas.
Como dijo, es posible que el archivo se actualice durante el proceso de copia, por lo que debe obtener un bloqueo de archivo en el archivo que desea copiar.
Sugiero leer esta pregunta para obtener información detallada sobre cómo usar un FileLock
.
No estoy seguro de cómo se implementa la arquitectura en su proyecto, pero debe tener un mecanismo de bloqueo en el archivo.
Cuando alguien está escribiendo en el archivo, debe bloquearlo. Y no debería copiar de ella mientras está siendo escrita, es decir, está bloqueada.
FileInputStream in = new FileInputStream(file);
try {
java.nio.channels.FileLock lock = in.getChannel().lock();
try {
Reader reader = new InputStreamReader(in, charset);
...
} finally {
lock.release();
}
} finally {
in.close();
}
Consulte esta pregunta aquí sobre cómo bloquear un archivo en java.
ACTUALIZAR
Entonces no tiene más opción que implementar el método de copia usted mismo o usar una biblioteca que no tenga un control similar.
Puedes ver el código de FileUtils
Da error si el archivo cambia durante la copia.
if (srcFile.length() != destFile.length()) {
throw new IOException("Failed to copy full contents from ''" +
srcFile + "'' to ''" + destFile + "''");
}
Tengo el mismo problema (con archivos grandes) resuelto usando archivos en Java 7:
File srcFile = ...
File destFile = ...
File directory = ...
if (!Files.exists(directory.toPath())) {
// use forceMkdir to create parent directory
FileUtils.forceMkdir(directory);
}
Files.copy(srcFile.toPath(), new FileOutputStream(destFile));