完善Stream

This commit is contained in:
tursom 2020-05-18 00:08:18 +08:00
parent 066d78bbed
commit f732137db9
12 changed files with 94 additions and 112 deletions

View File

@ -163,15 +163,18 @@ interface ByteBuffer : Closeable {
fun put(long: Long): Unit = write { it.putLong(long) }
fun put(float: Float): Unit = write { it.putFloat(float) }
fun put(double: Double): Unit = write { it.putDouble(double) }
fun put(str: String): Unit = put(str.toByteArray())
fun put(str: String): Int = put(str.toByteArray())
fun put(buffer: ByteBuffer): Int = buffer.writeTo(this)
fun put(byteArray: ByteArray, offset: Int = 0, len: Int = byteArray.size - offset) {
if (hasArray) {
fun put(byteArray: ByteArray, offset: Int = 0, len: Int = byteArray.size - offset): Int {
return if (hasArray) {
byteArray.copyInto(array, writeOffset, offset, offset + len)
writePosition += len
len
} else {
write {
val position = it.position()
it.put(byteArray, offset, len)
it.position() - position
}
}
}
@ -237,7 +240,7 @@ interface ByteBuffer : Closeable {
fun putLong(long: Long): Unit = put(long)
fun putFloat(float: Float): Unit = put(float)
fun putDouble(double: Double): Unit = put(double)
fun putString(str: String): Unit = put(str)
fun putString(str: String): Int = put(str)
fun putBuffer(buffer: ByteBuffer): Int = put(buffer)
fun putBytes(byteArray: ByteArray, startIndex: Int = 0, endIndex: Int = byteArray.size - startIndex) =
put(byteArray, startIndex, endIndex)

View File

@ -1,6 +1,4 @@
package cn.tursom.core.stream
interface IOStream : InputStream, OutputStream {
}
interface IOStream : InputStream, OutputStream

View File

@ -1,14 +1,23 @@
package cn.tursom.core.stream
import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.buffer.impl.HeapByteBuffer
import java.io.Closeable
interface InputStream : Closeable {
val available: Int get() = 0
fun skip(n: Long)
fun read(): Int
fun read(buffer: ByteArray)
fun read(buffer: ByteArray, offset: Int, len: Int)
fun read(buffer: ByteBuffer)
fun read(
buffer: ByteArray,
offset: Int = 0,
len: Int = buffer.size - offset
): Int {
val byteBuffer = HeapByteBuffer(buffer, offset, len)
byteBuffer.clear()
read(byteBuffer)
return byteBuffer.writePosition
}
}

View File

@ -1,13 +1,25 @@
package cn.tursom.core.stream
import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.buffer.impl.HeapByteBuffer
import java.io.Closeable
interface OutputStream : Closeable {
fun write(byte: Byte)
fun write(buffer: ByteArray)
fun write(buffer: ByteArray, offset: Int, len: Int)
fun write(buffer: ByteBuffer)
fun flush()
fun write(byte: Byte) {
write(byteArrayOf(byte))
}
fun write(
buffer: ByteArray,
offset: Int = 0,
len: Int = buffer.size - offset
): Int {
val byteBuffer = HeapByteBuffer(buffer, offset, len)
write(byteBuffer)
return byteBuffer.readPosition
}
fun flush() {}
}

View File

@ -7,8 +7,8 @@ import kotlin.coroutines.suspendCoroutine
interface SuspendInputStream : InputStream {
fun skip(n: Long, handler: () -> Unit)
fun read(handler: (Int) -> Unit)
fun read(buffer: ByteArray, handler: () -> Unit)
fun read(buffer: ByteArray, offset: Int, len: Int, handler: () -> Unit)
fun read(buffer: ByteArray, handler: (Int) -> Unit)
fun read(buffer: ByteArray, offset: Int, len: Int, handler: (Int) -> Unit)
fun read(buffer: ByteBuffer, handler: () -> Unit)
suspend fun suspendSkip(n: Long) {

View File

@ -2,75 +2,43 @@ package cn.tursom.core.stream.impl
import cn.tursom.core.buffer.ByteBuffer
import cn.tursom.core.stream.IOStream
import cn.tursom.core.stream.InputStream
import cn.tursom.core.stream.OutputStream
import cn.tursom.core.stream.SuspendInputStream
class ByteBufferIOStream(
private val buffer: ByteBuffer
) : IOStream, SuspendInputStream {
@Volatile
private var handler: (() -> Unit)? = null
class ByteBufferIOStream private constructor(
private val buffer: ByteBuffer,
val inputStream: ByteBufferInputStream,
val outputStream: ByteBufferOutputStream
) : IOStream,
SuspendInputStream,
InputStream by inputStream,
OutputStream by outputStream {
constructor(buffer: ByteBuffer) : this(buffer, ByteBufferInputStream(buffer), ByteBufferOutputStream(buffer))
override fun skip(n: Long, handler: () -> Unit) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun skip(n: Long) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun skip(n: Long, handler: () -> Unit) = handler()
override fun skip(n: Long) {}
override fun read(handler: (Int) -> Unit) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
handler(read())
}
override fun read(buffer: ByteArray, handler: () -> Unit) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
override fun read(buffer: ByteArray, handler: (Int) -> Unit) {
handler(read(buffer))
}
override fun read(buffer: ByteArray, offset: Int, len: Int, handler: () -> Unit) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
override fun read(buffer: ByteArray, offset: Int, len: Int, handler: (Int) -> Unit) {
handler(read(buffer, offset, len))
}
override fun read(buffer: ByteBuffer, handler: () -> Unit) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun read(): Int {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun read(buffer: ByteArray) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun read(buffer: ByteArray, offset: Int, len: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun read(buffer: ByteBuffer) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
read(buffer)
handler()
}
override fun close() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun write(byte: Byte) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun write(buffer: ByteArray) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun write(buffer: ByteArray, offset: Int, len: Int) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun write(buffer: ByteBuffer) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun flush() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
buffer.close()
inputStream.close()
outputStream.close()
}
}

View File

@ -9,27 +9,25 @@ class ByteBufferInputStream(
private var closed = false
override val available: Int get() = buffer.readable
override fun skip(n: Long) = checkClosed {
buffer.readPosition += n.toInt()
override fun skip(n: Long) {
checkClosed {
buffer.readPosition += n.toInt()
}
}
override fun read(): Int = if (closed || buffer.readable == 0) -1 else buffer.get().toInt()
override fun read(buffer: ByteArray) = checkClosed {
this.buffer.writeTo(buffer)
}
override fun read(buffer: ByteArray, offset: Int, len: Int) = checkClosed {
this.buffer.writeTo(buffer, offset, len)
} ?: -1
override fun read(buffer: ByteBuffer) {
checkClosed {
this.buffer.writeTo(buffer)
}
}
override fun read(buffer: ByteBuffer) = checkClosed {
this.buffer.writeTo(buffer)
}
private inline fun checkClosed(action: () -> Unit) {
if (!closed) action()
}
private inline fun <T> checkClosed(action: () -> T): T? = if (!closed) action() else null
override fun close() {
closed = true

View File

@ -7,27 +7,25 @@ class ByteBufferOutputStream(
val buffer: ByteBuffer
) : OutputStream {
private var closed = false
override fun write(byte: Byte) = checkClosed {
buffer.put(byte)
override fun write(byte: Byte) {
checkClosed {
buffer.put(byte)
}
}
override fun write(buffer: ByteArray) = checkClosed {
this.buffer.put(buffer)
}
override fun write(buffer: ByteArray, offset: Int, len: Int) = checkClosed {
override fun write(buffer: ByteArray, offset: Int, len: Int): Int = checkClosed {
this.buffer.put(buffer, offset, len)
}
} ?: -1
override fun write(buffer: ByteBuffer) = checkClosed {
buffer.writeTo(this.buffer)
override fun write(buffer: ByteBuffer) {
checkClosed {
buffer.writeTo(this.buffer)
}
}
override fun flush() {}
private inline fun checkClosed(action: () -> Unit) {
if (!closed) action()
}
private inline fun <T> checkClosed(action: () -> T): T? = if (!closed) action() else null
override fun close() {
closed = true

View File

@ -13,6 +13,7 @@ class BytesIOStream private constructor(
override fun skip(n: Long, handler: () -> Unit) = buBufferIOStream.skip(n, handler)
override fun read(handler: (Int) -> Unit) = buBufferIOStream.read(handler)
override fun read(buffer: ByteBuffer, handler: () -> Unit) = buBufferIOStream.read(buffer, handler)
override fun read(buffer: ByteArray, handler: () -> Unit) = buBufferIOStream.read(buffer, handler)
override fun read(buffer: ByteArray, offset: Int, len: Int, handler: () -> Unit) = buBufferIOStream.read(buffer, offset, len, handler)
override fun read(buffer: ByteArray, handler: (Int) -> Unit) = buBufferIOStream.read(buffer, handler)
override fun read(buffer: ByteArray, offset: Int, len: Int, handler: (Int) -> Unit) =
buBufferIOStream.read(buffer, offset, len, handler)
}

View File

@ -13,12 +13,8 @@ class JavaInputStream(
override fun read(): Int = inputStream.read()
override fun read(buffer: ByteArray) {
inputStream.read(buffer)
}
override fun read(buffer: ByteArray, offset: Int, len: Int) {
inputStream.read(buffer, offset, len)
override fun read(buffer: ByteArray, offset: Int, len: Int): Int {
return inputStream.read(buffer, offset, len)
}
override fun read(buffer: ByteBuffer) {

View File

@ -10,12 +10,9 @@ class JavaOutputStream(
outputStream.write(byte.toInt())
}
override fun write(buffer: ByteArray) {
outputStream.write(buffer)
}
override fun write(buffer: ByteArray, offset: Int, len: Int) {
override fun write(buffer: ByteArray, offset: Int, len: Int): Int {
outputStream.write(buffer, offset, len)
return len
}
override fun write(buffer: ByteBuffer) {

View File

@ -119,12 +119,14 @@ class NettyByteBuffer(
byteBuf.writeDouble(double)
}
override fun put(str: String) {
byteBuf.writeCharSequence(str, Charsets.UTF_8)
override fun put(str: String): Int {
return byteBuf.writeCharSequence(str, Charsets.UTF_8)
}
override fun put(byteArray: ByteArray, offset: Int, len: Int) {
override fun put(byteArray: ByteArray, offset: Int, len: Int): Int {
val writePosition = byteBuf.writerIndex()
byteBuf.writeBytes(byteArray, offset, len - offset)
return byteBuf.writerIndex() - writePosition
}
override fun toString(): String {