एक स्थानीय फ़ाइल से एक io.Reader बनाएँ


85

मैं एक स्थानीय फ़ाइल खोलना चाहता हूँ, और एक लौटाता हूँ io.Reader। इसका कारण यह है कि मुझे io.Readerएक पुस्तकालय का उपयोग करने की आवश्यकता है जिसका मैं उपयोग कर रहा हूं, जैसे:

func read(r io.Reader) (results []string) {

}

1
संभवतः golang.org/pkg के आस-पास ब्राउज़ करने में कुछ समय बिताने के लायक है और जिस तरह की चीज़ आप कर रहे हैं, वह आपको लगता है, ओएस, आईओ, आईओआई / आईओटील और बुफ़ियो।
twotwotwo

जवाबों:


112

os.Open एक रिटर्न io.Reader

http://play.golang.org/p/BskGT09kxL

package main

import (
    "fmt"
    "io"
    "os"
)

var _ io.Reader = (*os.File)(nil)

func main() {
    fmt.Println("Hello, playground")
}

30
हे, कि (* os.File) दिखाने के लिए चाल से प्यार है एक io.Reader खेल के मैदान से फ़ाइलों को खोलने में सक्षम होने के बिना है।
twotwotwo

@twotwotwo कि हैक क्या वास्तव में करता है। मैं सिचुएशनली मान रहा हूँ यह कुछ भी नहीं की एक फ़ाइल कह रहा है इसलिए यह कभी भी कुछ भी खोलने की कोशिश नहीं करता है।
एमएसचूलेट

7
@mschuett कम या ज्यादा: यह nilइंगित करने के लिए सही प्रकार का सूचक है os.File। (इस मामले में, आप वास्तव में इसके माध्यम से कुछ भी नहीं कर सकते हैं।) और var _ io.Reader = (*os.File)(nil)असाइनमेंट कंपाइलर चेक बनाता *os.Fileहै जो एक है io.Reader(या असाइनमेंट मान्य नहीं होगा)। आप खेल का मैदान के पास जाकर बदल लेते हैं *os.Fileकरने के लिए *os.Processआप त्रुटि यह चीजें हैं जो इंटरफेस को संतुष्ट नहीं करते के लिए उत्पन्न करता है देखेंगे।
twotwotwo

2
@fabrizioM जहां बिल्कुल प्रलेखन में यह कहता है कि * os.File एक रीडर को लागू करता है। अन्यथा, इस जवाब के बिना कि आप केवल आधिकारिक डॉक पढ़ने से खुद को कैसे समझ सकते हैं? ठीक है, मुझे लगता है कि func (f *File) Read(b []byte) (n int, err error), में के रूप में ही है Reader
अलीकांसेर कज़्लू

42

Os.Open का उपयोग करें () :

func ओपन (नाम स्ट्रिंग) (फ़ाइल * फ़ाइल, त्रुटि)

पढ़ने के लिए नामित फ़ाइल को खोलें। यदि सफल, लौटी फ़ाइल पर विधियों को पढ़ने के लिए इस्तेमाल किया जा सकता है; संबंधित फ़ाइल विवरणक में O_RDONLY मोड है। यदि कोई त्रुटि है, तो यह टाइप * PathError होगी।

प्रकार का लौटाया गया मान इंटरफ़ेस को *os.Fileलागू करता io.Readerहै।


26

प्रकार * os.File io.Reader इंटरफ़ेस को लागू करता है, इसलिए आप फ़ाइल को रीडर के रूप में वापस कर सकते हैं। लेकिन मैं आपको bufio पैकेज का उपयोग करने की सलाह देता हूं यदि आपके पास बड़ी फ़ाइलों को पढ़ने का इरादा है, तो कुछ इस तरह से:

file, err := os.Open("path/file.ext")
// if err != nil { ... }

return bufio.NewReader(file)

4
क्या आप इस बारे में विस्तार से बता सकते हैं कि आप bufioबड़ी फ़ाइलों के लिए अनुशंसा क्यों करते हैं ?
सिरो कोस्टा

1
@CiroCosta यदि आपके पास Gbs की एक विशाल फ़ाइल है जिसे आप मेमोरी पर पूरी तरह से पढ़ना नहीं चाहते हैं, तो उन मामलों के लिए हमें एक बफर का उपयोग करना चाहिए
Yandry Pozo

गो का रनटाइम समझदार स्थितियों में बफ़र्स का उपयोग करता है जैसे io.Copy अंतर्निहित बफ़र्स का फिर से उपयोग करेगा यदि उनका इंटरफ़ेस उपलब्ध है - अन्यथा यह एक आंतरिक बफर
बनाएगा

1
के लिए धन्यवाद path/file.ext। कोई और जवाब नहीं दिया कि क्या os.Fileथा।
Azurespot

5

यहाँ एक उदाहरण है जहाँ हम एक टेक्स्ट फ़ाइल खोलते हैं और एक io.Reader बनाते हैं जो लौटे * os.File उदाहरण f से है

package main

import (
    "io"
    "os"
)

func main() {
    f, err := os.Open("somefile.txt")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    var r io.Reader
    r = f
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.