2013-02-18 12 views
25

में gzip'd फ़ाइल को कैसे पढ़ा जाए जावा में, मैं एक FileInputStream पर एक GZIPInputStream लपेटूंगा और किया जाएगा। स्कैला में बराबर कैसे किया जाता है?स्कैला

Source.fromFile("a.csv.gz").... 

सेफाइल एक बुफर्डसोर्स लौटाता है, जो वास्तव में दुनिया को लाइनों के संग्रह के रूप में देखना चाहता है।

क्या इससे कोई और शानदार तरीका नहीं है?

Source.fromInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream("a.csv.gz")))) 
+1

यह * बिल्कुल * एक डुप्लिकेट नहीं है, लेकिन [यह प्रश्न] (http://stackoverflow.com/questions/5153544/how-to- read-from-zipped-xml-files-in-scala-code) उपयोगी हो सकता है। –

उत्तर

21

आप Source का उपयोग करें और सब कुछ जावा तरीके से करना नहीं चाहते हैं, तो हां, तो आप आप जावा में क्या कर रहे थे करने के लिए लपेटकर का एक और परत जोड़ने के लिए होगा। SourceInputStream एस लेता है लेकिन आपको Reader एस दे सकता है, जो आपको Source का उपयोग करने से रोकता है।

स्कैला आपको जावा की तुलना में अधिक काम करने के लिए बहुत अच्छा नहीं है, लेकिन विशेष रूप से I/O के साथ, आपको अक्सर जावा कक्षाओं में वापस आना पड़ता है। (आप हमेशा अपने स्वयं के शॉर्टकट, निश्चित रूप से परिभाषित कर सकते हैं:

def gis(s: String) = new GZIPInputStream(new BufferedInputStream(new FileInputStream(s))) 

क्या आप पहले से लिखे से मुश्किल से लंबी है, और अब आप इसे पुन: उपयोग कर सकते हैं।)

+1

यह ऊपर 'GZIPInputStream' होना चाहिए, न कि' Gzip' – Alexy

5

मैं धारा निर्माण में BufferedInputStream उपयोग को खत्म करेगा -> नया GZIPInputStream (नया FileInputStream ("a.csv.gz"))

+0

क्यों? चूंकि 'इनपुट इनपुट' अंतर्निहित धारा को बफर करता है? यह हमेशा मेरे लिए एक समस्या थी: हम कभी नहीं जानते कि कौन सा बफरिंग कर रहा है ... –

+5

GZIPInputStream स्वयं को बफरिंग करता है, जावाडोक से जानकारी: GZIPInputStream (इनपुटस्ट्रीम इन) - डिफ़ॉल्ट बफर आकार के साथ एक नई इनपुट स्ट्रीम बनाता है (जिसे मैं स्रोत में देखता हूं 512 बाइट्स है)। और GZIPInputStream (इनपुट आकार, int आकार) - निर्दिष्ट बफर आकार के साथ एक नई इनपुट स्ट्रीम बनाता है। – kairius