如何解决java.nio.ByteBuffer wrap 方法部分与 sbt run 一起使用
我有一个问题,我从一个大文件 ~ (100MB) 中读取了一个字节流,在一些整数之后,我得到了值 0(但仅限于 sbt run )。当我点击 IntelliJ 上的播放按钮时,我得到了我期望的值 > 0。
我的猜测是环境有些不同。但我看不出区别。
// DemoApp.scala
import java.nio.{ByteBuffer,ByteOrder}
object DemoApp extends App {
val inputStream = getClass.getResourceAsStream("/HandRanks.dat")
val handRanks = new Array[Byte](inputStream.available)
inputStream.read(handRanks)
inputStream.close()
def evalCard(value: Int) = {
val offset = value * 4
println("value: " + value)
println("offset: " + offset)
ByteBuffer.wrap(handRanks,offset,handRanks.length - offset).order(ByteOrder.LITTLE_ENDIAN).getInt
}
val cards: List[Int] = List(51,45,14,2,12,28,46)
def eval(cards: List[Int]): Unit = {
var p = 53
cards.foreach(card => {
println("p = " + evalCard(p))
p = evalCard(p + card)
})
println("result p: " + p);
}
eval(cards)
}
HandRanks.dat 可以在这里找到:(我把它放在一个叫做资源的目录中) https://github.com/Robert-Nickel/scala-texas-holdem/blob/master/src/main/resources/HandRanks.dat
build.sbt 是:
name := "LoadInts"
version := "0.1"
scalaVersion := "2.13.4"
在我的 Windows 机器上,我使用 sbt 1.4.6 和 Oracle Java 11
您将看到 evalCard
调用将工作 4 次,但在第五次之后返回值为 0。它应该大于 0,这是使用 IntelliJ 的播放按钮时的值。
解决方法
您没有阅读完整的内容。这个
val handRanks = new Array[Byte](inputStream.available)
只分配与 InputStream
一样多的缓冲区,然后你用
inputStream.read(handRanks)
根据默认设置,您将处理不同数量的数据,但它们永远不会是 100MB 的数据。为此,您必须将数据读入循环中的某个结构(坏主意)或分块处理(使用迭代器、流等)。
import scala.util.Using
// Using will close the resource whether error happens or not
Using(getClass.getResourceAsStream("/HandRanks.dat")) { inputStream =>
def readChunk(): Option[Array[Byte]] = {
// can be done better,but that's not the point here
val buffer = new Array[Byte](inputStream.available)
val bytesRead = inputStream.read(buffer)
if (bytesRead >= 0) Some(buffer.take(bytesRead))
else None
}
@tailrec def process(): Unit = {
readChunk() match {
case Some(chunk) =>
// do something
process()
case None =>
// nothing to do - EOF reached
}
}
process()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。