代码之家  ›  专栏  ›  技术社区  ›  thatismatt

为什么在这个Scala中会出现java.nio.BufferUnderflowException

  •  5
  • thatismatt  · 技术社区  · 16 年前

    scripting in Scala ,以处理某些日志文件:

    scala> import io.Source
    import io.Source
    
    scala> import java.io.File
    import java.io.File
    
    scala> val f = new File(".")
    f: java.io.File = .
    
    scala> for (l <- f.listFiles) {
     |   val src = Source.fromFile(l).getLines
     |   println( (0 /: src) { (i, line) => i + 1 } )
     | }
    3658
    java.nio.BufferUnderflowException
            at java.nio.Buffer.nextGetIndex(Unknown Source)
            at java.nio.HeapCharBuffer.get(Unknown Source)
            at scala.io.BufferedSource$$anon$2.next(BufferedSource.scala:86)
            at scala.io.BufferedSource$$anon$2.next(BufferedSource.scala:74)
            at scala.io.Source$$anon$6.next(Source.scala:307)
            at scala.io.Source$$anon$6.next(Source.scala:301)
            at scala.Iterator$cla...
    

    java.nio.BufferUnderflowException ?

    注意-我正在处理10个日志文件,每个文件大小约为1MB

    3 回复  |  直到 16 年前
        1
  •  2
  •   oxbow_lakes    16 年前

    我得到了 BufferUnderflowException 当我打开一个编码错误的文件时发生异常。它包含非法字符(根据错误的编码),并引发此误导性异常。

        2
  •  6
  •   Elazar Leibovich    16 年前

    我也很想知道为什么会发生这种情况,但我想这是因为 Source 透明地 重置。您可以按如下方式修复此问题:

    for (l <- g.listFiles if !l.isDirectory) {
     | val src = Source.fromFile(l)
     | println( (0 /: src.getLines) { (i, line) => i + 1 } )
     | src.reset
     | }
    

    重要的一点是 reset -应该是在一个 try-finally 阻止(尽管 isDirectory 测试可能也有用)

        3
  •  1
  •   overthink    16 年前

    这本质上是对Elazar答案的重述,但是如果您尝试使用 scala.io.Source.fromFile

    fromFile )因为我写的东西中有一个非常愚蠢的错误。。。