Mapped Memory Segment / Read from an existing file written via FileChannel or RandomAccessFile

Duncan Gittins duncan.gittins at gmail.com
Fri Apr 1 14:42:49 UTC 2022


RAF.writeLong puts long as eight bytes, high byte first so would be
consistent with readLong on any JVM. To read back via memory segment try
adding withOrder big endian

          final var longVal =
memorySegment.get(ValueLayout.JAVA_LONG.withOrder(ByteOrder.BIG_ENDIAN), 0);

Kind regards

Duncan


On Fri, 1 Apr 2022 at 00:29, Johannes Lichtenberger <
lichtenberger.johannes at gmail.com> wrote:

> Hello,
>
> I'm currently not sure what I'm doing wrong, but the following test is not
> working. Maybe it's too late, but I'm not sure if I'll have an immediate
> idea tomorrow, so I guess it's best to ask for help :-)
>
> kind regards
> Johannes
>
> import jdk.incubator.foreign.MemorySegment;
> import jdk.incubator.foreign.ResourceScope;
> import jdk.incubator.foreign.ValueLayout;
> import org.junit.jupiter.api.AfterEach;
> import org.junit.jupiter.api.BeforeEach;
>
> import java.io.IOException;
> import java.io.RandomAccessFile;
> import java.nio.channels.FileChannel;
> import java.nio.file.Files;
> import java.nio.file.Path;
> import java.nio.file.Paths;
>
> import static org.junit.jupiter.api.Assertions.assertEquals;
>
> public class TestFileChannelWithMemorySegment {
>
>   private Path tempFile;
>
>   @BeforeEach
>   public void setup() {
>     tempFile = Paths.get(System.getProperty("java.io.tmpdir"), "test.bin");
>   }
>
>   @AfterEach
>   public void tearDown() throws IOException {
>     Files.delete(tempFile);
>   }
>
>   @org.junit.jupiter.api.Test
>   public void test() throws IOException {
> //    try (final FileChannel fileChannel = FileChannel.open(tempFile,
> //
> StandardOpenOption.CREATE_NEW,
> //
> StandardOpenOption.WRITE)) {
> //      final ByteBuffer byteBuffer = ByteBuffer.allocate(8);
> //      byteBuffer.putLong(11);
> //      byteBuffer.position(0);
> //
> //      fileChannel.write(byteBuffer);
> //      fileChannel.force(true);
> //    }
>
>     try (final RandomAccessFile randomAccessFile = new
> RandomAccessFile(tempFile.toFile(), "rw")) {
>       randomAccessFile.writeLong(11);
>     }
>
>     try (final ResourceScope resourceScope =
> ResourceScope.newSharedScope()) {
>       final MemorySegment memorySegment =
>           MemorySegment.mapFile(tempFile, 0, Files.size(tempFile),
> FileChannel.MapMode.READ_ONLY, resourceScope);
>
>       final var longVal = memorySegment.get(ValueLayout.JAVA_LONG, 0);
>       assertEquals(11, longVal);
>     }
>   }
> }
>


More information about the panama-dev mailing list