scala.io.BufferedSourceクラスのバグの検証コード
Scalaのライブラリにバグ? - 玲瓏庵
の検証コード。
val buf = new StringBuilder; for(i <- 1 to 2000) { buf.append("あ"); } for(i <- 1 to 2000) { buf.append("a"); } buf.append("E"); val s = Source.fromInputStream(new ByteArrayInputStream(buf.toString.getBytes("UTF-8")),"UTF-8"); while(s.hasNext) { print(s.next); }
正常に動作しているならば最後に'E'って表示されるはず。
だけど'a'表示中に途切れる。
よくよく見ると昨日の説明は不足していて、詳しくはマルチバイト文字が来るとCharBufferの方はflipするとlimitが小さくなるのだが、ByteBufferの方はlimitが変わらないせいでその次にシングルバイト文字ばっかりくるとByteBufferにのこっちゃう。だけど、byteChannel.readに-1が来るとそこでByteBufferの残りを捨ててしまうって事だ。
つたない英語でscala-langに登録してみた。