golang中io的使用

一、读取小文件:ioutil.ReadFile()

读取文件的内容并显示在终端(使用ioutil一次将文件读取到内存中),这种方式适用于读取小文件:

package main
import (
    "fmt"
    "io/ioutil"
)

func main(){
    content, error := ioutil.ReadFile("E:/a.txt")
    if error != nil{
        fmt.Println("读取出错,错误为:", error)
    }

    fmt.Printf("%v", string(content))
}

二、读取文件的内容并显示在终端(带缓存区的方式-4096字节)

适合读取比较大的文件,使用os.Open(),os.Close(),bufio.NewReader(),reader.ReadString()函数和方法:

package main
import (
    "fmt"
    "os"
    "bufio"
    "io"
)

func main(){
    file, error := os.Open("E:/a.txt")

    if error != nil{
        fmt.Println("读取出错,错误为:", error)
    }

    defer file.Close()
    reader := bufio.NewReader(file)

    for {
        str, error := reader.ReadString('\n')
        if error == io.EOF{
            break
        }
        fmt.Println(str)
    }

    fmt.Println("文件读取成功,并且全部读取完毕。")
}

三、打开文件

func OpenFile()

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

OpenFile是一个更一般性的文件打开函数,大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等)打开指定名称的文件。如果操作成功,返回的文件对象可用于I/O。如果出错,错误底层类型是*PathError。

参数含义:

name:要打开的文件路径

flag:文件打开模式,可以用“|”进行组合

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  // 如果可能,打开时清空文件
)

FileMode:代表文件的模式和权限位。这些字位在所有的操作系统都有相同的含义,因此文件的信息可以在不同的操作系统之间安全的移植。不是所有的位都能用于所有的系统,唯一共有的是用于表示目录的ModeDir位。

const (
    // 单字符是被String方法用于格式化的属性缩写。
    ModeDir        FileMode = 1 << (32 - 1 - iota) // d: 目录
    ModeAppend                                     // a: 只能写入,且只能写入到末尾
    ModeExclusive                                  // l: 用于执行
    ModeTemporary                                  // T: 临时文件(非备份文件)
    ModeSymlink                                    // L: 符号链接(不是快捷方式文件)
    ModeDevice                                     // D: 设备
    ModeNamedPipe                                  // p: 命名管道(FIFO)
    ModeSocket                                     // S: Unix域socket
    ModeSetuid                                     // u: 表示文件具有其创建者用户id权限
    ModeSetgid                                     // g: 表示文件具有其创建者组id的权限
    ModeCharDevice                                 // c: 字符设备,需已设置ModeDevice
    ModeSticky                                     // t: 只有root/创建者能删除/移动文件
    // 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置
    ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
    ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位)
)

这些被定义的位是FileMode最重要的位。另外9个不重要的位为标准Unix rwxrwxrwx权限(任何人都可读、写、运行)。这些(重要)位的值应被视为公共API的一部分,可能会用于线路协议或硬盘标识:它们不能被修改,但可以添加新的位。

权限控制:unix/linux系统下才生效,windows下设置无效-0666

package main
import (
    "fmt"
    "os"
    "bufio"
)

func main(){
    file, error := os.OpenFile("E:/a.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)

    if error != nil{
        fmt.Println("读取出错,错误为:", error)
        return
    }

    defer file.Close()
    writer := bufio.NewWriter(file)

    for i := 0; i<10; i++{
        writer.WriteString("Hi, golang\n")
    }

    writer.Flush()

    s := os.FileMode(0666).String()
    fmt.Println(s)
}

四、复制文件

package main
import (
    "fmt"
    "io/ioutil"
)

func main(){
    filePath1 := "E:/demo1.txt"
    filePath2 := "E:/demo2.txt"

    content, error := ioutil.ReadFile(filePath1)
    if error != nil{
        fmt.Println("读取有问题")
        return
    }

    error = ioutil.WriteFile(filePath2, content, 0666)

    if error != nil{
        fmt.Println("写出失败")
    }
}

 

posted @   ricnman  阅读(251)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示