在kotlin中扩展DataInputStream
我已经子类DataInputStream并添加little-endian方法。 注意到我添加了一个新的表示原始InputStream
inp
属性。 我需要在新的方法中引用这个属性。 下面的代码工作正常:
import java.io.* import org.apache.poi.util.* class MyDataInputStream(val inp: InputStream) : DataInputStream(inp) { fun readShortLittle(): Short { val r: Short try { r = LittleEndian.readShort(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } fun readIntLittle(): Int { val r: Int try { r = LittleEndian.readInt(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } fun readLongLittle(): Long { val r: Long try { r = LittleEndian.readLong(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } } fun main(args: Array) { var i: Int val inp = MyDataInputStream(System.`in`) while (true) { // llegir int en binari si EOF break try { i = inp.readIntLittle() } catch (e: EOFException) { break } println(i); } }
不过,我想知道如何使用扩展方法做到这一点,如:
fun DataInputStream.readShortLittle(): Short { ... } fun DataInputStream.readIntLittle(): Int { .... } fun DataInputStream.readLongLittle(): Long { .... }
定义新的inp
属性时遇到问题。
严格来说,你不能,因为它可以通过扩展方法不可见的protected
字段访问。 但是使用this
而不是inp
应该可以工作,因为LittleEndian.read
方法将调用read
DataInputStream
,它将委托给in.read
。