2009-06-26 8 views
5

Tôi đã cố gắng để làm một số scripting in Scala, để xử lý một số file log:Tại sao tôi lại nhận được một java.nio.BufferUnderflowException trong Scala này

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... 

Tại sao tôi nhận java.nio.BufferUnderflowException này?

LƯU Ý - Tôi đang chế biến 10 file bản ghi, mỗi khoảng 1MB kích thước

Trả lời

2

Tôi cũng muốn được quan tâm như chính xác lý do tại sao điều này xảy ra nhưng tôi đoán đó là để làm với thực tế là Source là một đối tượng (tức là một singleton) và cách đối tượng được đặt minh bạch đặt lại. Bạn có thể khắc phục vấn đề như sau:

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

Các bit quan trọng là reset - mà có lẽ phải ở trong một khối try-finally (mặc dù các thử nghiệm isDirectory có lẽ là hữu ích quá)

6

tôi đã BufferUnderflowException ngoại lệ khi tôi mở một tập tin với mã hóa sai. Nó chứa các ký tự không hợp lệ (theo mã hóa sai) và ngoại lệ gây hiểu lầm này đã được ném ra.

1

Đây thực chất là một sự giải thích câu trả lời của Elazar, nhưng bạn cũng sẽ nhận được ngoại lệ này nếu bạn cố đọc một tệp nhị phân bằng cách sử dụng scala.io.Source.fromFile.

Tôi chỉ gặp phải điều này (vô tình cố đọc một .jpg với fromFile) do một lỗi rất ngu ngốc trong nội dung tôi đã viết ...