From c074646a1cfe6399ea4780475a1cb943fc02d06a Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Thu, 1 Nov 2012 22:18:07 -0700 Subject: [PATCH] publish writing-files --- examples.txt | 2 +- examples/reading-files/reading-files.sh | 2 + examples/writing-files/writing-files.go | 60 +++++++++++++++++++++---- examples/writing-files/writing-files.sh | 17 +++++++ 4 files changed, 72 insertions(+), 9 deletions(-) create mode 100644 examples/writing-files/writing-files.sh diff --git a/examples.txt b/examples.txt index a129630..03a95b2 100644 --- a/examples.txt +++ b/examples.txt @@ -54,7 +54,7 @@ URL Parsing SHA1 Hashes Base64 Encoding Reading Files -# Writing Files +Writing Files # File Operations Line Filters Command-Line Arguments diff --git a/examples/reading-files/reading-files.sh b/examples/reading-files/reading-files.sh index e34adca..b3ab74f 100644 --- a/examples/reading-files/reading-files.sh +++ b/examples/reading-files/reading-files.sh @@ -7,3 +7,5 @@ go 2 bytes @ 6: go 2 bytes @ 6: go 5 bytes: hello + +# Next we'll look at writing files. diff --git a/examples/writing-files/writing-files.go b/examples/writing-files/writing-files.go index 25d387d..864182e 100644 --- a/examples/writing-files/writing-files.go +++ b/examples/writing-files/writing-files.go @@ -1,14 +1,58 @@ +// Writing files in Go follows similar patterns to the +// ones we saw earlier for reading. + package main -import "os" +import ( + "bufio" + "fmt" + "io/ioutil" + "os" +) -func main() { - file, err := os.Create("writing-files.txt") - if err != nil { - panic(err) +func check(e error) { + if e != nil { + panic(e) } - defer file.Close() - file.WriteString("contents\n") } -// todo: streaming writes +func main() { + + // To start, here's how to dump a string (or just + // bytes) into a file. + d1 := []byte("hello\ngo\n") + err := ioutil.WriteFile("/tmp/dat1", d1, 0644) + check(err) + + // For more granular writes, open a file for writing. + f, err := os.Create("/tmp/dat2") + check(err) + + // It's idiomatic to defer a `Close` immediately + // after opening a file. + defer f.Close() + + // You can `Write` byte slices as you'd expect. + d2 := []byte{115, 111, 109, 101, 10} + n2, err := f.Write(d2) + check(err) + fmt.Printf("wrote %d bytes\n", n2) + + // A `WriteString` is also available. + n3, err := f.WriteString("writes\n") + fmt.Printf("wrote %d bytes\n", n3) + + // Issue a `Sync` to flush writes to stable storage. + f.Sync() + + // `bufio` provides buffered writers in addition + // to the buffered readers we saw earlier. + w := bufio.NewWriter(f) + n4, err := w.WriteString("buffered\n") + fmt.Printf("wrote %d bytes\n", n4) + + // Use `Flush` to ensure all buffered operations have + // been applied to the underlying writer. + w.Flush() + +} diff --git a/examples/writing-files/writing-files.sh b/examples/writing-files/writing-files.sh new file mode 100644 index 0000000..945a823 --- /dev/null +++ b/examples/writing-files/writing-files.sh @@ -0,0 +1,17 @@ +# Try running the file-writing code. +$ go run writing-files.go +wrote 5 bytes +wrote 7 bytes +wrote 9 bytes + +# Then check the contents of the written files. +$ cat /tmp/dat1 +hello +go +$ cat /tmp/dat2 +some +writes +buffered + +# Next we'll look at applying some of the file I/O ideas +# we've just seen to the `stdin` and `stdout` streams.