es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cargar recursos desde el directorio de construcción o no.

Necesito cargar algunos archivos en mi aplicación y leer/escribir en algunos archivos json.
Creé estos archivos en la carpeta de recursos y los obtengo usando ClassLoader y getResource().
El problema es que cuando uso el ClassLoader obtengo el archivo del directorio de construcción, por lo que cuando escribo en el archivo, los cambios no afectan al archivo de la carpeta src, solo al archivo del directorio de construcción, y cuando vuelvo a ejecutar la aplicación, los cambios se descartan.

Utilizo Gradle y IntelliJ.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema, debe configurar Gradle para copiar los recursos al directorio de construcción durante el proceso de construcción. Para hacer esto, agregue el siguiente código a su archivo build.gradle:

    sourceSets {
        main {
            resources {
                srcDirs = ["src/main/resources"]
            }
        }
    }
    
    task copyResources(type: Copy) {
        from sourceSets.main.resources
        into "${buildDir}/resources/main"
    }
    
    build.dependsOn copyResources
    

    Este código le indica a Gradle que incluya los recursos del directorio src/main/resources en el proceso de construcción y los copie al directorio build/resources/main. Luego, la tarea copyResources depende de la tarea build, por lo que siempre se ejecutará después de que se complete la tarea de construcción.

    Una vez que haya configurado Gradle para copiar los recursos, puede acceder a ellos utilizando el método getResourceAsStream(). Este método devuelve un InputStream que puede usar para leer el contenido del archivo. Aquí hay un ejemplo:

    InputStream inputStream = getClass().getResourceAsStream("/filename.json");
    

    Para escribir en un archivo, debe usar FileOutputStream en lugar del ClassLoader. Aquí hay un ejemplo:

    File file = new File(getClass().getResource("/filename.json").toURI());
    FileOutputStream outputStream = new FileOutputStream(file);
    outputStream.write("nuevos datos".getBytes());
    outputStream.close();
    

    Tenga en cuenta que este código asume que el archivo de recurso existe tanto en el directorio src/main/resources como en el directorio build/resources/main. Si necesita modificar el archivo en tiempo de ejecución y persistir los cambios en ejecuciones de la aplicación, debería escribir en un archivo externo en lugar del archivo de recurso.

Comments are closed.