免责声明:我从事的是非传统项目,所以如果一些假设看起来很荒谬,请不要感到震惊。
我希望为Scala中的整数,字符串和其他常见类型创建一个流阅读器,但首先我只关注整数。另请注意,我现在处理异常并不感兴趣 - 我将在适当的时候处理它们,这将反映在API中,同时我可以做出很大的假设,即不会发生故障。
API应该相对简单,但由于我正在研究的项目的性质,我不能依赖Scala的一些功能,API需要看起来像这样(略微简化为目的)这个问题):
object FileInputStream {
def open(filename: String): FileInputStream =
new FileInputStream(
try {
// Check whether the stream can be opened or not
val out = new java.io.FileReader(filename)
out.close()
Some[String](filename)
} catch {
case _: Throwable => None[String]
}
)
}
case class FileInputStream(var filename: Option[String]) {
def close: Boolean = {
filename = None[String]
true // This implementation never fails
}
def isOpen: Boolean = filename.isDefined
def readInt: Int = nativeReadInt
private def nativeReadInt: Int = {
??? // TODO
}
}
object StdIn {
def readInt: Int = nativeReadInt
private def nativeReadInt: Int = {
??? // TODO
}
}
另请注意,除Int
个变量外,我不能依赖此课程中的其他字段。这(可能)暗示必须为每个操作打开和关闭流。因此,不言而喻,实施效率不高,但这不是问题。
我的目标是实现两个nativeReadInt
方法,这样如果一个整数可以立即使用,输入流只会消耗一个整数。但是,如果输入没有以整数开始(w.r.t.最后一次读取操作),则不应读取任何内容,并且可以返回固定值,例如-1
。
我已经探索了几个高级Java和Scala标准API,但似乎都没有提供一种方法来重新打开一个特定位置的流。我希望避免仅基于java.io.InputStream
及其read()
和skip(n)
方法实现低级解析。
此外,为了让用户从标准输入流中读取,我需要避免使用scala.io.StdIn.readInt()
方法,因为它会读取“默认输入的整行”,因此会丢弃一些潜在的数据。
您是否了解可以在此处执行操作的Java或Scala API?
谢谢