이 스칼라에서 java.nio.bufferunderflowexception을받는 이유는 무엇입니까?
-
20-08-2019 - |
문제
나는 몇 가지를하려고 노력했다 스칼라 스크립팅, 일부 로그 파일을 처리하려면 :
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
) 내가 쓴 것에 매우 어리석은 벌레 때문에 ...
제휴하지 않습니다 StackOverflow