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