使用标准java java.io.DataInputStream
,可以读取异构二进制数据,如:
val stream = new DataInputStream(???)
val i = stream.readInt()
if (i > 5) {
val string = stream.readUTF()
???
} else {
val long = stream.readLong()
???
}
没关系,它会消耗整个线程,因此在高负载服务器中无用。
是否有可能为Scala找到/制作一些看起来像这样但是非阻塞的API?
当然有一个Netty的ByteBuf
,但它们需要像LengthFieldBasedFrameDecoder
这样的框架,以确保在我开始阅读之前已经收到所有数据,而在我的情况下,传入的数据包不会包括长度,因此在完全解析之前不可能知道数据包的长度。这种情况确实存在ReplayingDecoder
,但它的表现并不是很有希望。
解决方案我正在考虑将Netty处理程序包装成:
trait NonBlockingReader {
def readInt: Future[Int]
def readUTF: Future[String]
def readLong: Future[Long]
//...
}
然后它可以像:
一样使用 val source: NonBlockingReader = ???
val someResult: Future[Any] = for (
i <- source.readInt;
r <- if (i > 6) source.readUTF else source.readLong
) yield r
这是方便,好看,不需要框架,但我想知道这不是一个开销,我不是重新发明轮子?
答案 0 :(得分:0)
Scala不为非阻塞文件IO提供显式API,但普通Java API在这些情况下使用是正确的。您应该考虑使用java.nio.channels.AsynchronousFileChannel或Java NIO Api。