From 64b777c11ab1f2a600e89b0ee7c7725d26a23742 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Dec 2022 14:53:20 +0700 Subject: [PATCH] readNBytes impl --- .../dbotthepony/kstarbound/io/StarboundPak.kt | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/StarboundPak.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/StarboundPak.kt index f5a2ffdd..aafff2f1 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/StarboundPak.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/StarboundPak.kt @@ -7,6 +7,7 @@ import java.io.BufferedInputStream import java.io.Closeable import java.io.DataInputStream import java.io.File +import java.io.IOError import java.io.IOException import java.io.InputStream import java.io.RandomAccessFile @@ -101,6 +102,25 @@ class StarboundPak(val path: File, callback: (finished: Boolean, status: String) return reader.read() } + override fun readNBytes(len: Int): ByteArray { + require(len >= 0) { "Negative length to read: $len" } + + val readMax = len.coerceAtMost((length - innerOffset).toInt()) + + if (readMax == 0) + return ByteArray(0) + + val b = ByteArray(readMax) + reader.seek(innerOffset + offset) + val readBytes = reader.read(b) + + if (readBytes != readMax) + throw IOError(RuntimeException("Reading $readMax bytes returned only $readBytes bytes")) + + innerOffset += readBytes + return b + } + override fun read(b: ByteArray, off: Int, len: Int): Int { Objects.checkFromIndexSize(off, len, b.size) @@ -116,9 +136,8 @@ class StarboundPak(val path: File, callback: (finished: Boolean, status: String) reader.seek(innerOffset + offset) val readBytes = reader.read(b, off, readMax) - if (readBytes == -1) { + if (readBytes == -1) throw RuntimeException("Unexpected EOF, want to read $readMax bytes from starting $offset in $path") - } innerOffset += readBytes return readBytes