打开文件
Open - 常用于只读
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("a.txt")
f.Close()
if err != nil {
panic(err)
}
}
OpenFile - 非只读
参数 | 介绍 |
---|
os.O_CREATE | 创建 |
os.O_RDONLY | 只读,通常直接使用os.Open方法 |
os.O_WRONLY | 只写 |
os.O_RDWR | 读写 |
os.O_TRUNC | 清空文件 |
os.O_APPEND | 追加 |
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.OpenFile("a.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
f.Close()
if err != nil {
panic(err)
}
}
源码
func OpenFile(name string, flag int, perm FileMode) (*File, error) {
testlog.Open(name)
return openFileNolog(name, flag, perm)
}
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}
读文件
Read([]byte) - 按照字节读取
package main
import (
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("a.txt")
defer f.Close()
if err != nil {
panic(err)
}
x := make([]byte, 3)
y := make([]byte, 0, 10)
for {
n, err := f.Read(x)
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
y = append(y, x[:n]...)
}
fmt.Println(string(y))
}
bufio.NewReader - 逐行读取
- bufil 也有 Read() 方法, 使用示例与上一个例子类似
- 本例中, 展示 ReadString()
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func main() {
f, err := os.Open("a.txt")
defer f.Close()
if err != nil {
panic(err)
}
r := bufio.NewReader(f)
for {
s, err := r.ReadString('\n')
if err == io.EOF {
fmt.Println(s)
break
}
if err != nil {
panic(err)
}
fmt.Println(s)
}
}
ioutil.ReadFile - 读取全文
- ReadFile 内部就是用 ReadAll() 实现的
package main
import (
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile("a.txt")
if err != nil {
panic(err)
}
fmt.Println(string(content))
}
写文件
WriteString() 和 Write()
- WriteString 的参数是 string
- Write 的参数是 []byte(string)
package main
import "os"
func myWrite1(content string) {
f, err := os.OpenFile("a.txt", os.O_WRONLY|os.O_APPEND, 0)
defer f.Close()
if err != nil {
panic(err)
}
f.WriteString(content)
}
func myWrite2(b []byte) {
f, err := os.OpenFile("a.txt", os.O_WRONLY|os.O_APPEND, 0)
defer f.Close()
if err != nil {
panic(err)
}
f.Write(b)
}
func main() {
myWrite1("myWrite1\n")
myWrite2([]byte("myWrite2\n"))
}
bufio.NewWriter
package main
import (
"bufio"
"fmt"
"os"
)
func myWrite3(s string) {
f, err := os.OpenFile("a.txt", os.O_WRONLY|os.O_APPEND, 0)
defer f.Close()
if err != nil {
fmt.Println(err)
return
}
w := bufio.NewWriter(f)
w.WriteString(s)
w.Flush()
}
func myWrite4(b byte) {
f, err := os.OpenFile("a.txt", os.O_WRONLY|os.O_APPEND, 0)
defer f.Close()
if err != nil {
fmt.Println(err)
return
}
w := bufio.NewWriter(f)
w.Write(b)
w.Flush()
}
func main() {
myWrite3("myWrite3\n")
myWrite4('\n')
}
ioutil.WriteFile
- 新建/覆盖一个文件的内容
- WriteFile 内部使用的参数是 os.O_WRONLY|os.O_CREATE|os.O_TRUNC
package main
import (
"fmt"
"io/ioutil"
)
func main() {
s := "myWrite5"
err := ioutil.WriteFile("a.txt", []byte(s), 0644)
if err != nil {
panic(err)
}
}
练习
copyFile
package main
import (
"io"
"os"
)
func main() {
f1, err := os.Open("b.txt")
defer f1.Close()
if err != nil {
panic(err)
}
f2, err := os.OpenFile("a.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
defer f2.Close()
if err != nil {
panic(err)
}
x := make([]byte, 10)
for {
n, err := f1.Read(x)
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
f2.Write(x[:n])
}
}
实现cat命令
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func cat(r *bufio.Reader) {
for {
buf, err := r.ReadBytes('\n')
if err == io.EOF {
break
}
fmt.Fprintf(os.Stdout, "%s", buf)
}
}
func main() {
flag.Parse()
if flag.NArg() == 0 {
cat(bufio.NewReader(os.Stdin))
}
for i := 0; i < flag.NArg(); i++ {
f, err := os.Open(flag.Arg(i))
if err != nil {
fmt.Fprintf(os.Stdout, "reading from %s failed, err:%v\n", flag.Arg(i), err)
continue
}
cat(bufio.NewReader(f))
}
}
读取大文件
package main
import (
"bufio"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
"github.com/axgle/mahonia"
)
func checkErr(err error, pos string) {
if err != nil {
fmt.Printf("err: %v, pos: %v\n", err, pos)
}
}
func ConverEncoding(srcStr, encoding string) string {
enc := mahonia.NewDecoder(encoding)
utfStr := enc.ConvertString(srcStr)
return utfStr
}
func readData1() {
contentBytes, err := ioutil.ReadFile("数据/kaifang.txt")
checkErr(err, "readData1.ioutil.ReadFile")
contentStr := string(contentBytes)
lineStrs := strings.Split(contentStr, "\n\r")
for _, lineStr := range lineStrs {
r := ConverEncoding(lineStr, "GBK")
fmt.Println(r)
}
}
func readData2() {
f, err := os.Open("数据/kaifang.txt")
checkErr(err, "readData2.Open")
defer f.Close()
r := bufio.NewReader(f)
for {
lineBytes, _, err := r.ReadLine()
if err == io.EOF {
break
}
checkErr(err, "readData2.ReadLine")
lineStr := string(lineBytes)
r := ConverEncoding(lineStr, "GBK")
fmt.Println(r)
}
}
func main() {
readData2()
}