문제

나는 몇 가지를하려고 노력했다 스칼라 스크립팅, 일부 로그 파일을 처리하려면 :

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입니다.

도움이 되었습니까?

해결책

나는 또한 이것이 왜 이런 일이 일어나고 있는지 정확히 관심을 가질 것이지만, 그것은 그것이 사실과 관련이 있다고 생각합니다. Source 대상 (예 : 싱글 톤)이며 어떻게 얻는 지 투명하게 초기화. 다음과 같이 문제를 해결할 수 있습니다.

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

중요한 비트는 reset - 아마도 a try-finally 블록 (비록 isDirectory 테스트는 아마도 유용 할 것입니다)

다른 팁

나는 얻었다 BufferUnderflowException 예외가 잘못된 엔코딩이있는 파일을 열었을 때 예외입니다. 여기에는 불법적 인 캐릭터 (잘못된 인코딩에 따라)가 포함되어 있으며이 오해의 소지가있는 예외가 발생했습니다.

이것은 본질적으로 Elazar의 답변을 재조정이지만 사용하여 이진 파일을 읽으려고하면이 예외도 얻을 수 있습니다. scala.io.Source.fromFile.

방금 이것을 달렸습니다 (우연히 .jpg를 읽으려고합니다. fromFile) 내가 쓴 것에 매우 어리석은 벌레 때문에 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top