From 4203e1f2fa48e3e6839e2063a58bcaa6892a2281 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Tue, 16 Apr 2024 11:18:48 -0700 Subject: [PATCH] Rename FileChannelDataBlock to FileDataBlock Rename the internal `FileChannelDataBlock` to `FileDataBlock` since we want to fallback to a `RandomAccessFile` when a thread is interrupted. See gh-40096 --- ...annelDataBlock.java => FileDataBlock.java} | 35 ++++++------- .../boot/loader/zip/ZipContent.java | 25 +++++---- .../AssertFileChannelDataBlocksClosed.java | 6 +-- ...tFileChannelDataBlocksClosedExtension.java | 6 +-- ...ileChannelDataBlockManagedFileChannel.java | 6 +-- ...lockTests.java => FileDataBlockTests.java} | 51 ++++++++++--------- .../loader/zip/VirtualZipDataBlockTests.java | 4 +- 7 files changed, 67 insertions(+), 66 deletions(-) rename spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/{FileChannelDataBlock.java => FileDataBlock.java} (87%) rename spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/{FileChannelDataBlockTests.java => FileDataBlockTests.java} (83%) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/FileChannelDataBlock.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/FileDataBlock.java similarity index 87% rename from spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/FileChannelDataBlock.java rename to spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/FileDataBlock.java index 788841ea30..e94784a561 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/FileChannelDataBlock.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/FileDataBlock.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.boot.loader.zip; +import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.ClosedByInterruptException; @@ -29,14 +30,14 @@ import java.util.function.Supplier; import org.springframework.boot.loader.log.DebugLogger; /** - * Reference counted {@link DataBlock} implementation backed by a {@link FileChannel} with + * Reference counted {@link DataBlock} implementation backed by a {@link File} with * support for slicing. * * @author Phillip Webb */ -class FileChannelDataBlock implements CloseableDataBlock { +class FileDataBlock implements CloseableDataBlock { - private static final DebugLogger debug = DebugLogger.get(FileChannelDataBlock.class); + private static final DebugLogger debug = DebugLogger.get(FileDataBlock.class); static Tracker tracker; @@ -46,13 +47,13 @@ class FileChannelDataBlock implements CloseableDataBlock { private final long size; - FileChannelDataBlock(Path path) throws IOException { + FileDataBlock(Path path) throws IOException { this.channel = new ManagedFileChannel(path); this.offset = 0; this.size = Files.size(path); } - FileChannelDataBlock(ManagedFileChannel channel, long offset, long size) { + FileDataBlock(ManagedFileChannel channel, long offset, long size) { this.channel = channel; this.offset = offset; this.size = size; @@ -115,26 +116,26 @@ class FileChannelDataBlock implements CloseableDataBlock { } /** - * Return a new {@link FileChannelDataBlock} slice providing access to a subset of the - * data. The caller is responsible for calling {@link #open()} and {@link #close()} on - * the returned block. + * Return a new {@link FileDataBlock} slice providing access to a subset of the data. + * The caller is responsible for calling {@link #open()} and {@link #close()} on the + * returned block. * @param offset the start offset for the slice relative to this block - * @return a new {@link FileChannelDataBlock} instance + * @return a new {@link FileDataBlock} instance * @throws IOException on I/O error */ - FileChannelDataBlock slice(long offset) throws IOException { + FileDataBlock slice(long offset) throws IOException { return slice(offset, this.size - offset); } /** - * Return a new {@link FileChannelDataBlock} slice providing access to a subset of the - * data. The caller is responsible for calling {@link #open()} and {@link #close()} on - * the returned block. + * Return a new {@link FileDataBlock} slice providing access to a subset of the data. + * The caller is responsible for calling {@link #open()} and {@link #close()} on the + * returned block. * @param offset the start offset for the slice relative to this block * @param size the size of the new slice - * @return a new {@link FileChannelDataBlock} instance + * @return a new {@link FileDataBlock} instance */ - FileChannelDataBlock slice(long offset, long size) { + FileDataBlock slice(long offset, long size) { if (offset == 0 && size == this.size) { return this; } @@ -145,7 +146,7 @@ class FileChannelDataBlock implements CloseableDataBlock { throw new IllegalArgumentException("Size must not be negative and must be within bounds"); } debug.log("Slicing %s at %s with size %s", this.channel, offset, size); - return new FileChannelDataBlock(this.channel, this.offset + offset, size); + return new FileDataBlock(this.channel, this.offset + offset, size); } /** diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipContent.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipContent.java index b5afa6311e..d9c5f1c689 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipContent.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/zip/ZipContent.java @@ -74,7 +74,7 @@ public final class ZipContent implements Closeable { private final Kind kind; - private final FileChannelDataBlock data; + private final FileDataBlock data; private final long centralDirectoryPos; @@ -96,7 +96,7 @@ public final class ZipContent implements Closeable { private SoftReference, Object>> info; - private ZipContent(Source source, Kind kind, FileChannelDataBlock data, long centralDirectoryPos, long commentPos, + private ZipContent(Source source, Kind kind, FileDataBlock data, long centralDirectoryPos, long commentPos, long commentLength, int[] lookupIndexes, int[] nameHashLookups, int[] relativeCentralDirectoryOffsetLookups, NameOffsetLookups nameOffsetLookups, boolean hasJarSignatureFile) { this.source = source; @@ -449,7 +449,7 @@ public final class ZipContent implements Closeable { private final Source source; - private final FileChannelDataBlock data; + private final FileDataBlock data; private final long centralDirectoryPos; @@ -463,8 +463,7 @@ public final class ZipContent implements Closeable { private int cursor; - private Loader(Source source, Entry directoryEntry, FileChannelDataBlock data, long centralDirectoryPos, - int maxSize) { + private Loader(Source source, Entry directoryEntry, FileDataBlock data, long centralDirectoryPos, int maxSize) { this.source = source; this.data = data; this.centralDirectoryPos = centralDirectoryPos; @@ -561,7 +560,7 @@ public final class ZipContent implements Closeable { private static ZipContent loadNonNested(Source source) throws IOException { debug.log("Loading non-nested zip '%s'", source.path()); - return openAndLoad(source, Kind.ZIP, new FileChannelDataBlock(source.path())); + return openAndLoad(source, Kind.ZIP, new FileDataBlock(source.path())); } private static ZipContent loadNestedZip(Source source, Entry entry) throws IOException { @@ -573,7 +572,7 @@ public final class ZipContent implements Closeable { return openAndLoad(source, Kind.NESTED_ZIP, entry.getContent()); } - private static ZipContent openAndLoad(Source source, Kind kind, FileChannelDataBlock data) throws IOException { + private static ZipContent openAndLoad(Source source, Kind kind, FileDataBlock data) throws IOException { try { data.open(); return loadContent(source, kind, data); @@ -584,7 +583,7 @@ public final class ZipContent implements Closeable { } } - private static ZipContent loadContent(Source source, Kind kind, FileChannelDataBlock data) throws IOException { + private static ZipContent loadContent(Source source, Kind kind, FileDataBlock data) throws IOException { ZipEndOfCentralDirectoryRecord.Located locatedEocd = ZipEndOfCentralDirectoryRecord.load(data); ZipEndOfCentralDirectoryRecord eocd = locatedEocd.endOfCentralDirectoryRecord(); long eocdPos = locatedEocd.pos(); @@ -634,7 +633,7 @@ public final class ZipContent implements Closeable { * @return the offset within the data where the archive begins * @throws IOException on I/O error */ - private static long getStartOfZipContent(FileChannelDataBlock data, ZipEndOfCentralDirectoryRecord eocd, + private static long getStartOfZipContent(FileDataBlock data, ZipEndOfCentralDirectoryRecord eocd, Zip64EndOfCentralDirectoryRecord zip64Eocd) throws IOException { long specifiedOffsetToStartOfCentralDirectory = (zip64Eocd != null) ? zip64Eocd.offsetToStartOfCentralDirectory() : eocd.offsetToStartOfCentralDirectory(); @@ -699,7 +698,7 @@ public final class ZipContent implements Closeable { private volatile String name; - private volatile FileChannelDataBlock content; + private volatile FileDataBlock content; /** * Create a new {@link Entry} instance. @@ -789,13 +788,13 @@ public final class ZipContent implements Closeable { * @throws IOException on I/O error */ public CloseableDataBlock openContent() throws IOException { - FileChannelDataBlock content = getContent(); + FileDataBlock content = getContent(); content.open(); return content; } - private FileChannelDataBlock getContent() throws IOException { - FileChannelDataBlock content = this.content; + private FileDataBlock getContent() throws IOException { + FileDataBlock content = this.content; if (content == null) { int pos = this.centralRecord.offsetToLocalHeader(); checkNotZip64Extended(pos); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosed.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosed.java index 75c208e585..b7e4846f2e 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosed.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosed.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,8 +25,8 @@ import java.lang.annotation.Target; import org.junit.jupiter.api.extension.ExtendWith; /** - * Annotation that can be added to tests to assert that {@link FileChannelDataBlock} files - * are not left open. + * Annotation that can be added to tests to assert that {@link FileDataBlock} files are + * not left open. * * @author Phillip Webb */ diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosedExtension.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosedExtension.java index 21ad19da62..bb6b536681 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosedExtension.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/AssertFileChannelDataBlocksClosedExtension.java @@ -31,7 +31,7 @@ import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; import org.springframework.boot.loader.ref.DefaultCleanerTracking; -import org.springframework.boot.loader.zip.FileChannelDataBlock.Tracker; +import org.springframework.boot.loader.zip.FileDataBlock.Tracker; import static org.assertj.core.api.Assertions.assertThat; @@ -45,14 +45,14 @@ class AssertFileChannelDataBlocksClosedExtension implements BeforeEachCallback, @Override public void beforeEach(ExtensionContext context) throws Exception { tracker.clear(); - FileChannelDataBlock.tracker = tracker; + FileDataBlock.tracker = tracker; DefaultCleanerTracking.set(tracker::addedCleanable); } @Override public void afterEach(ExtensionContext context) throws Exception { tracker.assertAllClosed(); - FileChannelDataBlock.tracker = null; + FileDataBlock.tracker = null; } private static final class OpenFilesTracker implements Tracker { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockManagedFileChannel.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockManagedFileChannel.java index 6e945dbd43..00c1f480df 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockManagedFileChannel.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockManagedFileChannel.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ package org.springframework.boot.loader.zip; -import org.springframework.boot.loader.zip.FileChannelDataBlock.ManagedFileChannel; +import org.springframework.boot.loader.zip.FileDataBlock.ManagedFileChannel; /** * Test access to {@link ManagedFileChannel} details. @@ -28,6 +28,6 @@ public final class FileChannelDataBlockManagedFileChannel { private FileChannelDataBlockManagedFileChannel() { } - public static int BUFFER_SIZE = FileChannelDataBlock.ManagedFileChannel.BUFFER_SIZE; + public static int BUFFER_SIZE = FileDataBlock.ManagedFileChannel.BUFFER_SIZE; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileDataBlockTests.java similarity index 83% rename from spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockTests.java rename to spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileDataBlockTests.java index b5abefc6aa..ac27a7c43a 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileChannelDataBlockTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/FileDataBlockTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,17 +28,17 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.springframework.boot.loader.zip.FileChannelDataBlock.Tracker; +import org.springframework.boot.loader.zip.FileDataBlock.Tracker; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; /** - * Tests for {@link FileChannelDataBlock}. + * Tests for {@link FileDataBlock}. * * @author Phillip Webb */ -class FileChannelDataBlockTests { +class FileDataBlockTests { private static final byte[] CONTENT = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; @@ -55,19 +55,19 @@ class FileChannelDataBlockTests { @AfterEach void resetTracker() { - FileChannelDataBlock.tracker = null; + FileDataBlock.tracker = null; } @Test void sizeReturnsFileSize() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { assertThat(block.size()).isEqualTo(CONTENT.length); } } @Test void readReadsFile() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { ByteBuffer buffer = ByteBuffer.allocate(CONTENT.length); assertThat(block.read(buffer, 0)).isEqualTo(6); assertThat(buffer.array()).containsExactly(CONTENT); @@ -76,7 +76,8 @@ class FileChannelDataBlockTests { @Test void readReadsFileWhenThreadHasBeenInterrupted() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + Files.write(this.tempFile.toPath(), CONTENT); + try (FileDataBlock block = createAndOpenBlock()) { ByteBuffer buffer = ByteBuffer.allocate(CONTENT.length); Thread.currentThread().interrupt(); assertThat(block.read(buffer, 0)).isEqualTo(6); @@ -89,7 +90,7 @@ class FileChannelDataBlockTests { @Test void readDoesNotReadPastEndOfFile() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { ByteBuffer buffer = ByteBuffer.allocate(CONTENT.length); assertThat(block.read(buffer, 2)).isEqualTo(4); assertThat(buffer.array()).containsExactly(0x02, 0x03, 0x04, 0x05, 0x0, 0x0); @@ -98,7 +99,7 @@ class FileChannelDataBlockTests { @Test void readWhenPosAtSizeReturnsMinusOne() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { ByteBuffer buffer = ByteBuffer.allocate(CONTENT.length); assertThat(block.read(buffer, 6)).isEqualTo(-1); } @@ -106,7 +107,7 @@ class FileChannelDataBlockTests { @Test void readWhenPosOverSizeReturnsMinusOne() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { ByteBuffer buffer = ByteBuffer.allocate(CONTENT.length); assertThat(block.read(buffer, 7)).isEqualTo(-1); } @@ -114,7 +115,7 @@ class FileChannelDataBlockTests { @Test void readWhenPosIsNegativeThrowsException() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { ByteBuffer buffer = ByteBuffer.allocate(CONTENT.length); assertThatIllegalArgumentException().isThrownBy(() -> block.read(buffer, -1)); } @@ -122,7 +123,7 @@ class FileChannelDataBlockTests { @Test void sliceWhenOffsetIsNegativeThrowsException() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { assertThatIllegalArgumentException().isThrownBy(() -> block.slice(-1, 0)) .withMessage("Offset must not be negative"); } @@ -130,7 +131,7 @@ class FileChannelDataBlockTests { @Test void sliceWhenSizeIsNegativeThrowsException() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { assertThatIllegalArgumentException().isThrownBy(() -> block.slice(0, -1)) .withMessage("Size must not be negative and must be within bounds"); } @@ -138,7 +139,7 @@ class FileChannelDataBlockTests { @Test void sliceWhenSizeIsOutOfBoundsThrowsException() throws IOException { - try (FileChannelDataBlock block = createAndOpenBlock()) { + try (FileDataBlock block = createAndOpenBlock()) { assertThatIllegalArgumentException().isThrownBy(() -> block.slice(2, 5)) .withMessage("Size must not be negative and must be within bounds"); } @@ -146,7 +147,7 @@ class FileChannelDataBlockTests { @Test void sliceReturnsSlice() throws IOException { - try (FileChannelDataBlock slice = createAndOpenBlock().slice(1, 4)) { + try (FileDataBlock slice = createAndOpenBlock().slice(1, 4)) { assertThat(slice.size()).isEqualTo(4); ByteBuffer buffer = ByteBuffer.allocate(4); assertThat(slice.read(buffer, 0)).isEqualTo(4); @@ -157,8 +158,8 @@ class FileChannelDataBlockTests { @Test void openAndCloseHandleReferenceCounting() throws IOException { TestTracker tracker = new TestTracker(); - FileChannelDataBlock.tracker = tracker; - FileChannelDataBlock block = createBlock(); + FileDataBlock.tracker = tracker; + FileDataBlock block = createBlock(); assertThat(block).extracting("channel.referenceCount").isEqualTo(0); tracker.assertOpenCloseCounts(0, 0); block.open(); @@ -184,9 +185,9 @@ class FileChannelDataBlockTests { @Test void openAndCloseSliceHandleReferenceCounting() throws IOException { TestTracker tracker = new TestTracker(); - FileChannelDataBlock.tracker = tracker; - FileChannelDataBlock block = createBlock(); - FileChannelDataBlock slice = block.slice(1, 4); + FileDataBlock.tracker = tracker; + FileDataBlock block = createBlock(); + FileDataBlock slice = block.slice(1, 4); assertThat(block).extracting("channel.referenceCount").isEqualTo(0); tracker.assertOpenCloseCounts(0, 0); block.open(); @@ -215,14 +216,14 @@ class FileChannelDataBlockTests { tracker.assertOpenCloseCounts(2, 2); } - private FileChannelDataBlock createAndOpenBlock() throws IOException { - FileChannelDataBlock block = createBlock(); + private FileDataBlock createAndOpenBlock() throws IOException { + FileDataBlock block = createBlock(); block.open(); return block; } - private FileChannelDataBlock createBlock() throws IOException { - return new FileChannelDataBlock(this.tempFile.toPath()); + private FileDataBlock createBlock() throws IOException { + return new FileDataBlock(this.tempFile.toPath()); } static class TestTracker implements Tracker { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/VirtualZipDataBlockTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/VirtualZipDataBlockTests.java index 33f93bfb0f..46feb71900 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/VirtualZipDataBlockTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/zip/VirtualZipDataBlockTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -58,7 +58,7 @@ class VirtualZipDataBlockTests { @Test void createContainsValidZipContent() throws IOException { - FileChannelDataBlock data = new FileChannelDataBlock(this.file.toPath()); + FileDataBlock data = new FileDataBlock(this.file.toPath()); data.open(); List centralRecords = new ArrayList<>(); List centralRecordPositions = new ArrayList<>();