go语言文件读取以及IO操作

2019-02-19  本文已影响0人  __robin

文章目录

一、文件信息

os.FileInfo接口

接口属性

type FileInfo interface {
    Name() string       // 文件的名字
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位 (例-rw-rw-r--)
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{}   // 底层数据来源(可以返回nil)
}

os.fileStat结构体实现了FileInfo接口的所有方法

type fileStat struct {
    name    string
    size    int64
    mode    FileMode
    modTime time.Time
    sys     syscall.Stat_t
}

示例

fileInfo, err := os.Stat("./aa.txt")
if err != nil{
    fmt.Println(err)
    return
}
fmt.Printf("%T: %v", fileInfo, fileInfo)  // *os.fileStat: &{aa.txt 23 ...}
fmt.Println(fileInfo.Name())              // aa.txt
fmt.Println(fileInfo.IsDir())             // false
fmt.Println(fileInfo.Size())              // 23
fmt.Println(fileInfo.Mode())              // -rw-rw-r--
fmt.Println(fileInfo.ModTime())           // 2019-02-15 14:44:39.745 +0800 CST

文件路径相关函数

路径相关的函数有两个包,pathpath/filepath,
两个包内有一些相同的函数,如IsAbs()Join()Dir()
filepath中的函数兼容各个操作系统,涉及到windows系统路径操作时,应该使用filepath

二、文件的常规操作

创建目录 如果存在则失败

创建文件 如果存在会覆盖

打开文件

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

关闭文件

删除文件或目录

三、文件的读写操作

读取文件

示例:

//step1:打开文件
fileName := ".text.txt"
file, err := os.Open(fileName)
if err != nil {
    fmt.Println("打开错误", err)
    return
}
//step2:读/写
//从file中读取最多len(bs)个字节,存入bs切边中,n是实际读取的数量
bs := make([]byte, 1024, 1024)
for {
    n, err := file.Read(bs)
    if n == 0 || err == io.EOF {
        fmt.Println("读取结束")
        break
    }
    fmt.Println(string(bs[:n]))
}
//step3:关闭文件
file.Close()

写入文件

写入文件与读取类似

文件复制

示例:

func copyFile(srcFile, destFile string) (int64, error) {
    file1, err := os.Open(srcFile)
    if err != nil {
        return 0, err
    }
    file2, err := os.OpenFile(destFile, os.O_WRONLY|os.O_CREATE, os.ModePerm)
    if err != nil {
        return 0, err
    }
    defer file1.Close()
    defer file2.Close()
    return io.Copy(file2, file1)
}

四、ioutil包

示例:

data, err := ioutil.ReadFile("aa.txt")
fmt.Println(string(data))
if err != nil {
    fmt.Println(err)
    return
}

err = ioutil.WriteFile("bb.txt", data, 0666)
if err != nil {
    fmt.Println(err)
    return
}

fileInfos, err := ioutil.ReadDir(".")
if err != nil {
    fmt.Println(err)
    return
}
for i := range fileInfos {
    fmt.Println(i, fileInfos[i].IsDir(), fileInfos[i].Name())
}

五、bufio包

io.Reader和io.Writer

type Reader interface {
    Read(p []byte) (n int, err error)
}

type Writer interface {
    Write(p []byte) (n int, err error)
}

os.Open(name string) (*File, error)返回的文件指针就实现了io.Reader

bufio.Reader结构体

示例:

s := strings.NewReader("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
br := bufio.NewReader(s)
b := make([]byte, 20)

n, err := br.Read(b)
fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)  // ABCDEFGHIJKLMNOPQRST 20 <nil>

n, err = br.Read(b)
fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)  // UVWXYZ1234567890 16 <nil>

n, err = br.Read(b)
fmt.Printf("%-20s %-2v %v\n", b[:n], n, err)  // 0 EOF

示例:

s := strings.NewReader("ABCDEFG\n123456\n")
br := bufio.NewReader(s)

for {
    sli, err := br.ReadBytes('\n')
    if err err == io.EOF {
        break
    }
    fmt.Println(sli)
}
// [65 66 67 68 69 70 71 10]
// [49 50 51 52 53 54 10]

示例:

s := strings.NewReader("ABCDEFG\n123456\n")
br := bufio.NewReader(s)
for {
    s, err := br.ReadString('\n')
    if err err == io.EOF {
        break
    }
    fmt.Print(s)
}
// ABCDEFG
// 123456

bufio.Writer结构体

示例:

file1, _ := os.Open("aa.txt")
defer file1.Close()
reader := bufio.NewReader(file1)
file2, _ := os.Create("cc.txt")
defer file2.Close()
writer := bufio.NewWriter(file2)

for {
    bs, err := reader.ReadBytes('\n')
    if err == io.EOF {
        fmt.Println("读取完毕")
        break
    }
    writer.Write(bs)
    writer.Flush()
}

bufio.Scanner结构体

示例:

scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanLines)
for scanner.Scan() {
    if scanner.Text() == "q" {
        break
    }
    fmt.Println(scanner.Text()) // Println will add back the final '\n'
}
if err := scanner.Err(); err != nil {
    fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
上一篇 下一篇

猜你喜欢

热点阅读