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.

Lee MemoryMappedFile de C# en Java.

¡Hola y feliz año nuevo!

He estado buscando una forma de implementar este fragmento de código en Java/Kotlin, si es posible…

El código en cuestión es el siguiente:

MemoryMappedFile memfile = MemoryMappedFile.OpenExisting("MAHMSharedMemory");
BinaryReader br = new BinaryReader(memfile.CreateViewStream());
br.BaseStream.Seek(0, SeekOrigin.Begin);

La documentación de OpenExisting indica lo siguiente:

Abre un archivo de memoria mapeada existente con el nombre especificado en la memoria del sistema.

Y la documentación de CreateViewStream me dice:

Crea un flujo que se mapea a una vista del archivo de memoria mapeada.

¿Cuál sería el equivalente en Java/Kotlin de estos dos métodos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, Java y Kotlin no tienen un equivalente directo a las clases MemoryMappedFile y BinaryReader utilizadas en el fragmento de código C# proporcionado. Sin embargo, puedes lograr una funcionalidad similar utilizando la clase MappedByteBuffer en Java y Kotlin.

    Para abrir un archivo mapeado en memoria existente en Java, puedes utilizar la clase FileChannel y el método mmap. Aquí tienes un ejemplo:

    File file = new File("MAHMSharedMemory");
    FileChannel channel = FileChannel.open(file.toPath());
    MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    

    En el código anterior, primero creamos un objeto File con el nombre del archivo mapeado en memoria. Luego abrimos un FileChannel para ese archivo y utilizamos el método map para crear una instancia de MappedByteBuffer que se mapea a todo el archivo.

    Para leer datos de MappedByteBuffer, puedes utilizar el método get. Aquí tienes un ejemplo:

    buffer.position(0);
    int value = buffer.getInt();
    

    En este ejemplo, establecemos la posición del búfer en 0 y luego leemos un valor entero utilizando el método getInt.

    Ten en cuenta que los archivos mapeados en memoria en Java se crean en memoria virtual, por lo que no verás el archivo real en el disco. Además, la lectura y escritura de datos en un MappedByteBuffer no es segura para subprocesos, por lo que deberás sincronizar el acceso si lo estás haciendo desde múltiples hilos.

Comments are closed.