从`InputStream`

时间:2016-07-11 14:05:34

标签: java scala io inputstream

免责声明:我从事的是非传统项目,所以如果一些假设看起来很荒谬,请不要感到震惊。

上下文

我希望为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?

谢谢

0 个答案:

没有答案