2009-06-26 15 views
5

मैं कुछ scripting in Scala ऐसा करने के लिए, कुछ लॉग फाइल संसाधित करने का प्रयास किया गया था में एक java.nio.BufferUnderflowException मिलता है:क्यों मैं इस स्काला

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 लॉग फाइल, प्रत्येक प्रसंस्करण कर रहा हूँ 1 एमबी के बारे में आकार में

उत्तर

2

मैं भी रूप में वास्तव में क्यों यह हो रहा है दिलचस्पी होगी लेकिन मैं यह तथ्य यह है कि के साथ क्या करना है लगता था 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 परीक्षण भी शायद उपयोगी है)

6

मैं BufferUnderflowException अपवाद मिला जब मैंने गलत enconding के साथ एक फाइल खोली। इसमें अवैध पात्र थे (गलत एन्कोडिंग के अनुसार) और इस भ्रामक अपवाद को फेंक दिया गया था।

1

यह अनिवार्य रूप से एलाजार के उत्तर का पुन: विश्राम है, लेकिन यदि आप scala.io.Source.fromFile का उपयोग करके बाइनरी फ़ाइल को पढ़ने का प्रयास करते हैं तो आपको यह अपवाद भी मिलेगा।

मैं सिर्फ इस में कुछ मैंने लिखा में एक बहुत ही बेवकूफ बग के कारण (गलती से fromFile के साथ एक .jpg पढ़ने का प्रयास) भाग गया ...