Saltar al contenido

Java OutputStream equivalente a getClass().getClassLoader().getResourceAsStream()

Este equipo de expertos pasados varios días de trabajo y recopilación de de información, obtuvieron la solución, deseamos que te resulte útil para tu plan.

Solución:

En general, no puede volver a colocar cosas en un recurso que obtuvo del cargador de clases:

  • Los recursos del cargador de clases suelen ser de solo lectura; es decir, en archivos de solo lectura/directorios de solo lectura.

  • Si obtuvo el recurso de un archivo JAR, los archivos JAR no son simplemente actualizables. (Para “actualizar” necesita extraer el contenido del JAR antiguo y crear un nuevo JAR con el contenido actualizado. Todo tiene que ver con la estructura de los archivos ZIP…)

  • En algunos casos, el recurso del cargador de clases se habrá descargado sobre la marcha y no hay forma de enviar los cambios al lugar desde donde se descargó.

Incluso si puede actualizar un recurso que obtuvo del cargador de clases, es una mala idea/mala práctica.

  • Hacer esto “contamina” la instalación limpia de la aplicación con las preferencias del usuario. Entre otras cosas, esto significa que la instalación no se puede compartir con otros usuarios (a menos que maneje preferencias para varios usuarios…).

  • Hay problemas de seguridad al tener aplicaciones instaladas como escribibles para que las preferencias incrustadas puedan actualizarse. ¡Piensa en virus! ¡Piense en un usuario que podría estar inclinado a desechar las preferencias de otro usuario!

  • Hay problemas de administración al tener copias de aplicaciones específicas del usuario. Y si el usuario tiene que instalar su propia copia de una aplicación, también existen posibles problemas de seguridad.

  • Puede haber problemas técnicos con el bloqueo de archivos o el almacenamiento en caché en algunas plataformas que interfieren con las actualizaciones (seguras) o dificultan que una aplicación cargue el recurso actualizado sin reiniciar.

Finalmente, esta NO es la forma en que los administradores de sistemas (y los usuarios educados) esperan que se comporte el software. Las aplicaciones Java deberían tratar con las preferencias del usuario de la manera esperada:

  • Puede utilizar la API de preferencias de Java.

  • Puede escribir un archivo de propiedades que contenga las preferencias en un directorio de escritura del usuario apropiado para el sistema operativo.

  • En Windows, puede usar una API específica de Windows para almacenar las preferencias en el registro de Windows, excepto que esto hace que su aplicación dependa de Windows. (No veo ninguna ventaja real en hacer esto, pero no soy un experto en Windows).

Cuando envuelva su aplicación como un archivo JAR, su archivo de propiedades será un archivo (posiblemente comprimido) dentro de ese JAR, y sería una mala idea intentar escribir en su propio JAR.

getResourceAsStream() está destinado a abrir recursos para la lectura, y estos pueden estar en cualquier parte del classpath. No puede escribir en URL o dentro de JAR, solo puede escribir en archivos, por lo que no tiene sentido darle la misma API para la salida.

Encuentre un directorio en el que pueda escribir y escriba sus propiedades allí.

Puede ser una buena idea copiar sus propiedades desde su classpath de instalación (posiblemente dentro de un JAR) directamente a un archivo si aún no existe, como primera operación al iniciar la aplicación. Esto le dará un archivo de propiedades en el que puede escribir, sin embargo, la copia maestra de este archivo de propiedades provendrá de la entrega de su proyecto.

Parece que desea almacenar las preferencias del usuario. Considere usar la API de preferencias de Java para eso.

Aquí puedes ver las comentarios y valoraciones de los lectores

Si crees que ha sido provechoso nuestro artículo, sería de mucha ayuda si lo compartieras con más juniors y nos ayudes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *