একটি স্থানীয় ফাইল থেকে একটি io.Reader তৈরি করুন


89

আমি একটি স্থানীয় ফাইল খুলতে এবং একটি ফিরে চাই io.Reader। কারণটি হ'ল আমি যে io.Readerলাইব্রেরিটি ব্যবহার করছি তার জন্য আমাকে একটি খাওয়ানো দরকার , যেমন:

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

}

4
সম্ভবত golang.org/pkg এর আশেপাশে ব্রাউজ করার জন্য কিছুটা সময় ব্যয় করা ভাল এবং আপনি যে ধরণের কাজ করছেন তার জন্য এটি ওএস, আইও, আইও / আইউটিল এবং বুফিওর মতো মনে হচ্ছে।
twotwotwo

উত্তর:


117

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 showing
twotwotwo

@twotwotwo এই হ্যাকটি ঠিক কী করে। আমি সিনথেটিকভাবে ধরে নিচ্ছি যে এটি কিছুই ফাইলের কথা বলছে তাই এটি কখনই কোনও কিছু খোলার চেষ্টা করে না।
এমসচুয়েট

7
@ এসএমচুয়েট কম বেশি: এটি কোনওকে nilনির্দেশ করতে সঠিক টাইপের একটি পয়েন্টার os.File। (এই ক্ষেত্রে, আপনি এর মাধ্যমে সত্যই কিছু করতে পারবেন না)) এবং var _ io.Reader = (*os.File)(nil)অ্যাসাইনমেন্টটি সংকলকটি পরীক্ষা করে তোলে যে *os.Fileএটি একটি io.Reader(বা অন্যথায় অ্যাসাইনমেন্টটি বৈধ হবে না)। আপনি যদি খেলার মাঠে যান এবং পরিবর্তিত *os.Fileহন তবে *os.Processআপনি ইন্টারফেসটি সন্তুষ্ট না করে এমন জিনিসগুলির জন্য উত্পন্ন ত্রুটিটি দেখতে পাবেন।
twotwotwo

4
@ ফ্যাব্রিজিওএম যেখানে ডকুমেন্টেশনে হুবহু বলেছেন যে * ওএস.ফাইল একটি রিডার প্রয়োগ করে। অন্যথায়, এই উত্তর ছাড়া আপনি কীভাবে কেবল কোনও অফিসিয়াল ডকটি পড়ে নিজেকে আবিষ্কার করতে পারেন? ঠিক আছে, আমি এটি দেখতে func (f *File) Read(b []byte) (n int, err error), একই হিসাবে Reader
আলিয়াকসান্ডর কাজলু

43

Os.Open () ব্যবহার করুন :

func ওপেন (নামের স্ট্রিং) (ফাইল * ফাইল, ভুল ত্রুটি)

ওপেন পড়ার জন্য নামকৃত ফাইলটি খুলবে। যদি সফল হয় তবে ফিরে আসা ফাইলের পদ্ধতিগুলি পড়ার জন্য ব্যবহার করা যেতে পারে; সম্পর্কিত ফাইল বর্ণনাকারীর মোড O_RDONLY রয়েছে। যদি কোনও ত্রুটি হয় তবে এটি * পাঠেররর টাইপ হবে।

প্রকারের প্রত্যাবর্তিত মান ইন্টারফেস *os.Fileপ্রয়োগ করে io.Reader


27

টাইপ * ওএস.ফায়াল আইও.আরেডার ইন্টারফেস প্রয়োগ করে, তাই আপনি ফাইলটি পাঠক হিসাবে ফিরিয়ে দিতে পারেন। তবে আমি আপনাকে সুপারিশ করছি বুফিও প্যাকেজটি ব্যবহার করার জন্য যদি আপনার বড় ফাইলগুলি পড়ার উদ্দেশ্য থাকে তবে এরকম কিছু:

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

return bufio.NewReader(file)

4
আপনি bufioবড় ফাইলগুলির জন্য কেন সুপারিশ করবেন তা দয়া করে বিস্তারিত বলতে পারেন ?
সিরো কোস্টা

4
@ কিরো কোস্টা আপনার কাছে যদি জিবিএসের একটি বিশাল ফাইল থাকে তবে আপনি এটি মেমোরিতে সম্পূর্ণরূপে পড়তে চান না, সুতরাং সেই ক্ষেত্রে আমাদের
বাফারটি

গো-র রানটাইম সংবেদনশীল পরিস্থিতিতে বাফার ব্যবহার করে যেমন io. কপি তাদের ইন্টারফেস উপলব্ধ থাকলে অন্তর্নিহিত বাফারগুলি পুনরায় ব্যবহার করবে - অন্যথায় এটি একটি অভ্যন্তরীণ বাফার তৈরি করবে
colm.anseo

4
জন্য ধন্যবাদ path/file.ext। অন্য কোন উত্তর নেই যা os.Fileছিল তা বানান ।
Azurespot

5

এখানে একটি উদাহরণ রয়েছে যেখানে আমরা একটি পাঠ্য ফাইল খুলি এবং ফিরে আসা * ওএস থেকে একটি io.Reader তৈরি করি ile

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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.