go 的文件处理

准备一个文件 imooc.txt

hello world!

 

一、使用 io/ioutil 包

定义一个 check 函数

func check(err error) {
	if err != nil {
		fmt.Println(err)
	}
}

1. 读文件(使用 ReadFile 或 ReadAll)

// ReadFile 直接读文件=> 切片序列
func demo_read_file(title string) {
	b, err := ioutil.ReadFile(title)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("ReadFile:%q\n", string(b))
}

// ReadAll 读取一个 io.Reader,返回字节序列
func demo_read_all(title string) {
	f, err := os.Open(title)
	check(err)
	defer f.Close()
	// 读取整个 Reader流
	b, err := ioutil.ReadAll(f)
	check(err)
	fmt.Printf("ReadAll: %q\n", string(b))
}

输出

ReadFile:"hello world!"
ReadAll: "hello world!"

2. 写文件(使用 WriteFile)

// WriteFile 直接将切片序列=> 文件
func demo_write_file() {
	// 如果文件不存在,则创建一个文件(有权限的话);否则清空文件。
	err := ioutil.WriteFile("imooc.txt", []byte("hello write!"), 0644)
	if err != nil {
		fmt.Println(err)
	}
}

再读一遍,输出:

ReadFile:"hello write!"

 

二、使用 os包

1. 打开文件

// Open 以O_RDONLY 的方式来打开文件
func demo_open() {
	f, err := os.Open("imooc.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

// OpenFile 以自定义的方法打开文件
func demo_open_file() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE, 0775)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

输出

3
3

2. 读方法

// 读方法
func demo_read() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0775)
	check(err)
	defer f.Close()

	buf := make([]byte, 2)
	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read1: %q\n", string(buf))

	// 第一个参数为偏移的大小;第二个位置为 0,1,2,分别代表开头,当前,结尾
	f.Seek(4, 1)

	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read2: %q\n", string(buf))

	r := bufio.NewReader(f)
	// 读取指定位数
	b, err := r.Peek(4)
	check(err)
	fmt.Printf("Peek: %q\n", string(b))

}

输出

Read1: "he"
Read2: "wr"
Peek: "ite!"

3. 写方法

// 写方法
func demo_write() {
	f, err := os.Create("imooc.bak")
	check(err)
	defer f.Close()

	// b := []byte{115, 111, 109, 101, 10}
	b := []byte("你好\n")

	// 如果文件存在,则清空文件。在打开的一个文件中,内容是往后添加,直到Close 该文件
	n, err := f.Write(b)
	check(err)
	fmt.Printf("Write: %d\n", n)

	n, err = f.WriteString("我们啊\n")
	check(err)
	fmt.Printf("WriteString: %d\n", n)

	f.Sync()

	w := bufio.NewWriter(f)
	n, err = w.WriteString("buffered\n")
	check(err)
	fmt.Printf("bufio WriteString: %d\n", n)

	// 必须刷新,才能看到文件内容
	w.Flush()
}

 再读一遍,输出

Write: 7
WriteString: 10
bufio WriteString: 9
ReadFile:"你好\n我们啊\nbuffered\n"

 

 三、整个文件

// demo_file.go

package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"os"
)

func check(err error) {
	if err != nil {
		fmt.Println(err)
	}
}

// ---- 使用io/ioutil ----

// ReadFile 直接读文件=> 切片序列
func demo_read_file(title string) {
	b, err := ioutil.ReadFile(title)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("ReadFile:%q\n", string(b))
}

// WriteFile 直接将切片序列=> 文件
func demo_write_file() {
	// 如果文件不存在,则创建一个文件(有权限的话);否则清空文件。
	err := ioutil.WriteFile("imooc.txt", []byte("hello write!"), 0644)
	if err != nil {
		fmt.Println(err)
	}
}

// ReadAll 读取一个 io.Reader,返回字节序列
func demo_read_all(title string) {
	f, err := os.Open(title)
	check(err)
	defer f.Close()
	// 读取整个 Reader流
	b, err := ioutil.ReadAll(f)
	check(err)
	fmt.Printf("ReadAll: %q\n", string(b))
}

// ---- 使用os ----

// Open 以O_RDONLY 的方式来打开文件
func demo_open() {
	f, err := os.Open("imooc.txt")
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

// OpenFile 以自定义的方法打开文件
func demo_open_file() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE, 0775)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	fmt.Println(f.Fd())
}

// 读方法
func demo_read() {
	f, err := os.OpenFile("imooc.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0775)
	check(err)
	defer f.Close()

	buf := make([]byte, 2)
	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read1: %q\n", string(buf))

	// 第一个参数为偏移的大小;第二个位置为 0,1,2,分别代表开头,当前,结尾
	f.Seek(4, 1)

	_, err = f.Read(buf)
	check(err)
	fmt.Printf("Read2: %q\n", string(buf))

	r := bufio.NewReader(f)
	// 读取指定位数
	b, err := r.Peek(4)
	check(err)
	fmt.Printf("Peek: %q\n", string(b))

}

// 写方法
func demo_write() {
	f, err := os.Create("imooc.bak")
	check(err)
	defer f.Close()

	// b := []byte{115, 111, 109, 101, 10}
	b := []byte("你好\n")

	// 如果文件存在,则清空文件。在打开的一个文件中,内容是往后添加,直到Close 该文件
	n, err := f.Write(b)
	check(err)
	fmt.Printf("Write: %d\n", n)

	n, err = f.WriteString("我们啊\n")
	check(err)
	fmt.Printf("WriteString: %d\n", n)

	f.Sync()

	w := bufio.NewWriter(f)
	n, err = w.WriteString("buffered\n")
	check(err)
	fmt.Printf("bufio WriteString: %d\n", n)

	// 必须刷新,才能看到文件内容
	w.Flush()
}

func main() {
	// demo_read_file("imooc.txt")
	// demo_read_all("imooc.txt")
	// demo_write_file()
	// demo_read_file("imooc.txt")
	// demo_open()
	// demo_open_file()
	// demo_read()
	demo_write()
	demo_read_file("imooc.bak")
}

 

四、os 包的其他方法(os

func IsExist(err error) bool
func IsNotExist(err error) bool

func Mkdir(name string, perm FileMode) error
func MkdirAll(path string, perm FileMode) error

func Remove(name string) error
func RemoveAll(path string) error
func Rename(oldpath, newpath string) error

func (m FileMode) IsDir() bool
func (m FileMode) IsRegular() bool

 

posted on 2017-10-15 10:22  Lemo_wd  阅读(390)  评论(0编辑  收藏  举报

导航