read parser parse manage library leer framework java xml file-io

parser - read xml java 8



¿El método de archivo Java "canWrite()" admite el bloqueo? (5)

Además, si haces un cheque seguido de una escritura, entonces tienes una condición de carrera. El estado podría cambiar entre el cheque y la escritura. A veces es mejor tratar de hacer lo que quiere y manejar los errores con gracia. tal vez un mecanismo de reintento de n intentos con un mayor tiempo de retraso de repliegue.

O redefina su prueba. En este caso, tal vez podría probar que el tamaño del archivo no ha cambiado durante un período de tiempo antes de procesarlo.

Otra opción es dividir el código en dos, podría tener otro hilo, quizás una tarea de cuarzo, responsable de mover los archivos terminados a un directorio diferente que procese el código principal.

Tengo una aplicación Java que monitorea una carpeta para archivos XML entrantes. Cuando se detecta un archivo nuevo, necesito probar el archivo que no se está actualizando y se está cerrando. Mi idea es usar File.canWrite () para probar esto. ¿Hay algún problema con hacer esto? ¿Es esta una buena manera de probar que un archivo ha sido completamente escrito?

Otras ideas que estoy lanzando son:

  • Analice el archivo XML entrante y pruebe que la etiqueta de cierre está allí.
  • Compruebe el carácter EoF.

Simplemente no estoy seguro de que alguno de estos métodos maneje todos los escenarios.


No, canWrite no es adecuado para este propósito. En general, el archivo será modificable incluso si está escribiendo otro proceso.

Necesita un protocolo de nivel superior para coordinar el bloqueo. Si planea usar este código en una plataforma única, puede usar las funciones FileLock de NIO . Pero lea la documentación detenidamente y tenga en cuenta que, en muchas plataformas, el bloqueo solo es orientativo.

Otro enfoque es hacer que un proceso escriba el archivo con un nombre que su proceso no reconocerá, luego cambie el nombre del archivo a un nombre reconocible cuando se complete la escritura. En la mayoría de las plataformas, la operación de cambio de nombre es atómica si el origen y el destino son del mismo volumen del sistema de archivos. El cambio de nombre puede usar una extensión de archivo diferente, o incluso mover el archivo de un directorio a otro (en el mismo volumen).

Como en este caso trabaja exclusivamente con XML, buscar una etiqueta de cierre funcionaría, pero no es infalible, ¿qué pasa si hay comentarios después del marcado final, o el escritor o simplemente no escribe XML válido?

Buscar el EOF no funcionará. Siempre habrá un EOF, incluso cuando el escritor acaba de abrir el archivo y aún no ha escrito nada. Si esto no fuera así, lo más fácil sería permitir que el lector comience a analizar tan pronto como aparezca el archivo; simplemente bloquearía hasta que el escritor cerró el archivo. Pero el sistema de archivos no funciona de esta manera. Cada archivo tiene un final, incluso si algún proceso lo está moviendo actualmente.


Por lo que yo sé, no hay forma de saber si otro proceso tiene actualmente un acceso abierto a un archivo de Java. Una opción es usar la clase FileLock de la nueva io. Esto no es compatible con todas las plataformas, pero si los archivos son locales y el proceso de escritura del archivo coopera, esto debería funcionar para cualquier plataforma que soporte bloqueos.


Si controla tanto el lector como el escritor, una posible técnica de bloqueo sería crear un directorio de bloqueo, que típicamente es una operación atómica, para la lectura y la duración del proceso de escritura. Si toma este tipo de enfoque, debe gestionar la falla potencial de un proceso que resulte en un directorio de bloqueo "colgado".

Como mencionó Cheekysoft, los archivos no son atómicos y no son adecuados para el bloqueo.

Si no controla el escritor, por ejemplo, si está siendo producido por un daemon FTP, entonces la técnica de cambio de nombre o la técnica de demora para el lapso de tiempo son sus mejores opciones.


Una cosa que parece funcionar en Windows es la siguiente: Crear un objeto File () que represente el archivo en cuestión (usando constructor con nombre de archivo completo) - Crear un segundo objeto File idéntico, de la misma manera. - Prueba firstFile.renameTo (secondFile)

Este ejercicio de cambio de nombre simulado parece tener éxito con archivos que no están abiertos para su edición por otra aplicación (probé con Word), pero falla si están abiertos.

Y como el nombre de archivo nw = el nombre de archivo anterior, no crea ningún otro trabajo.