2009-06-26 1 views
5

이 스칼라에 java.nio.BufferUnderflowException을받을 수 있나요 :이유는 무엇 일부 로그 파일을 처리하기 위해, 일부 <a href="http://www.codecommit.com/blog/scala/scala-as-a-scripting-language" rel="nofollow noreferrer">scripting in Scala</a>을하려고했다

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을 이유는 무엇입니까?

주 - 나는 또한 이런 일이되는 이유를 정확하게로 싶네

답변

2

크기가 약 1MB (10 개) 로그 파일을 각각 처리하고있어하지만 난 사실 그와 함께 할 것 같아요 것 Source은 개체 (즉, 싱글 톤)이며 어떻게 을 투명하게 얻을 수 있습니까?이 재설정됩니다. 다음과 같이 문제를 해결할 수 있습니다

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

중요한 비트 인 reset -합니다 (isDirectory 시험이 너무 아마 유용하지만) 아마 내가 BufferUnderflowException 예외를 가지고

6

try-finally 블록에 있어야하는 나는 잘못된 enconding으로 파일을 열었을 때. 그것은 (잘못된 인코딩에 따라) 불법 문자를 포함하고이 오해의 소지가있는 예외가 발생했습니다.

1

이것은 본질적으로 Elazar의 대답을 다시 말한 것이지만 scala.io.Source.fromFile을 사용하여 이진 파일을 읽으려고하면이 예외가 발생합니다. 난 그냥 인해 내가 쓴 뭔가 매우 바보 같은 버그 (실수 fromFile와 .JPG를 읽으려고)이 우연히

...