आइए गो में फ़ाइलों को पढ़ने और लिखने के सभी तरीकों की एक 1-संगत सूची बनाएं।
क्योंकि फ़ाइल API हाल ही में बदल गया है और अधिकांश अन्य उत्तर Go 1 के साथ काम नहीं करते हैं। वे भी याद करते हैं bufioजो महत्वपूर्ण IMHO है।
निम्नलिखित उदाहरणों में मैं इसे पढ़ने से और गंतव्य फ़ाइल पर लिखकर एक फ़ाइल की प्रतिलिपि बनाता हूं।
मूल के साथ शुरू करो
package main
import (
"io"
"os"
)
func main() {
// open input file
fi, err := os.Open("input.txt")
if err != nil {
panic(err)
}
// close fi on exit and check for its returned error
defer func() {
if err := fi.Close(); err != nil {
panic(err)
}
}()
// open output file
fo, err := os.Create("output.txt")
if err != nil {
panic(err)
}
// close fo on exit and check for its returned error
defer func() {
if err := fo.Close(); err != nil {
panic(err)
}
}()
// make a buffer to keep chunks that are read
buf := make([]byte, 1024)
for {
// read a chunk
n, err := fi.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
if n == 0 {
break
}
// write a chunk
if _, err := fo.Write(buf[:n]); err != nil {
panic(err)
}
}
}
यहाँ मैंने उपयोग किया os.Openऔर os.Createजो सुविधाजनक रैपर हैं os.OpenFile। हमें आमतौर पर OpenFileसीधे कॉल करने की आवश्यकता नहीं होती है ।
ईओएफ का इलाज करने वाला नोटिस। प्रत्येक कॉल Readको भरने की कोशिश करता है buf, और io.EOFयदि ऐसा करने में फ़ाइल के अंत तक पहुँच जाता है तो त्रुटि के रूप में देता है। इस मामले bufमें अभी भी डेटा रखेगा। परिणामी कॉल Readशून्य को रिटर्न के रूप में पढ़ती है और बाइट की संख्या io.EOFत्रुटि के रूप में होती है। किसी अन्य त्रुटि के कारण घबराहट होगी।
का उपयोग करते हुए bufio
package main
import (
"bufio"
"io"
"os"
)
func main() {
// open input file
fi, err := os.Open("input.txt")
if err != nil {
panic(err)
}
// close fi on exit and check for its returned error
defer func() {
if err := fi.Close(); err != nil {
panic(err)
}
}()
// make a read buffer
r := bufio.NewReader(fi)
// open output file
fo, err := os.Create("output.txt")
if err != nil {
panic(err)
}
// close fo on exit and check for its returned error
defer func() {
if err := fo.Close(); err != nil {
panic(err)
}
}()
// make a write buffer
w := bufio.NewWriter(fo)
// make a buffer to keep chunks that are read
buf := make([]byte, 1024)
for {
// read a chunk
n, err := r.Read(buf)
if err != nil && err != io.EOF {
panic(err)
}
if n == 0 {
break
}
// write a chunk
if _, err := w.Write(buf[:n]); err != nil {
panic(err)
}
}
if err = w.Flush(); err != nil {
panic(err)
}
}
bufioसिर्फ यहाँ एक बफर के रूप में काम कर रहा है, क्योंकि हमारे पास डेटा के लिए बहुत कुछ नहीं है। अधिकांश अन्य स्थितियों में (विशेष रूप से पाठ फ़ाइलों के साथ) bufioहमें आसानी से और लचीले ढंग से पढ़ने और लिखने के लिए एक अच्छा एपीआई देकर बहुत उपयोगी है , जबकि यह पर्दे के पीछे बफरिंग को संभालता है।
का उपयोग करते हुए ioutil
package main
import (
"io/ioutil"
)
func main() {
// read the whole file at once
b, err := ioutil.ReadFile("input.txt")
if err != nil {
panic(err)
}
// write the whole body at once
err = ioutil.WriteFile("output.txt", b, 0644)
if err != nil {
panic(err)
}
}
बहुत आसान! लेकिन इसका उपयोग केवल तभी करें जब आप सुनिश्चित हों कि आप बड़ी फ़ाइलों के साथ काम नहीं कर रहे हैं।