4

私は、JavaのBufferedInputStreamを特性として実装することを求めた本「ScalafortheImpatient」によって与えられた問題を解決しようとしています。これが私の実装です、

trait Buffering {           
    this:InputStream =>
        private[this] val bis = {
            new JavaBufferedInputStream(this)
        }
        override def read = bis.read
        override def read(byte:Array[Byte], off:Int, len:Int) = bis.read(byte, off, len)
        override def available = bis.available
        override def close() {
            bis.close
        }
        override def skip(n:Long) = bis.skip(n)
}

def main(args:Array[String]) {
    val bfis = new FileInputStream(new File("foo.txt")) with Buffering
    println(bfis.read)
    bfis.close
}

しかし、これは私にJavaスタックオーバーフローエラーを与えるので、それの何が問題になっていますか?ありがとう!

4

3 に答える 3

4

予期しないスタック オーバーフローが発生しているようです。これらをトラブルシューティングするための鍵は、スタック トレースの繰り返しサイクルを確認することです。通常、繰り返しフレームを割り当てているものを指します。ここでは、次のように表示されます。

at C.Buffering$class.read(C.scala:12)
at C.C$$anon$1.read(C.scala:23)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at C.Buffering$class.read(C.scala:12)
at C.C$$anon$1.read(C.scala:23)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:256)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at C.Buffering$class.read(C.scala:12)

したがって、下から上に読むと、あなたが呼んでいるのがあなたread(byte, ...)を呼んbis.read(byte, ...)でいるように見えBufferedInputStream.readますread(byte, ...)

new BufferedInputStream(this)基になるものを呼び出しreadているように見えますInputStreamが、基になるthisものはあなたのオブジェクトであり、呼び出しをデリゲートするため、bis無限の再帰があります。

著者は、適切なメソッドを参照するためにabstract override使用できるスタック可能な変更パターンを使用することを望んでいると推測しています。superread

于 2012-04-16T06:22:24.243 に答える
0

私は「せっかちな人のためのScala」を経験しています。第10章の演習8の解決策として私が持っているものは次のとおりです。

import java.io._

object BufferedInputStream extends App {

  trait Buffering {
    this: FileInputStream =>
    val br = new BufferedInputStream(this)
  }

  def bufferedReader(f: String): Unit = {
    val fis = new FileInputStream(f) with Buffering
    var c = 0
    var blen = 8192
    var len = 0
    var b = new Array[Byte](blen)
    while (fis.br.available > 0) {
      if (fis.br.available > blen) len = blen
      else len = fis.br.available
      c = fis.br.read(b, 0, len)
      if (c == -1) return
      print((for (i <- 0 to (c - 1)) yield b(i).toChar).mkString)
    }
    fis.br.close
    fis.close
  }

  bufferedReader("webpagexample")

}
于 2015-04-12T09:30:25.150 に答える
0

多分これが答えです。多分私が理解したことから。

trait Buffering extends InputStream{
abstract override def read()=
{
    println("Hello");
    super.read()
}
}
val t = new ByteArrayInputStream("hello".getBytes()) with Buffering
于 2014-08-24T14:05:30.597 に答える