go应用专题:file操作

参考:

https://www.cnblogs.com/shiluoliming/p/8312928.html(简单写文件操作的4种方法)

创建文件

复制代码
import (
    "bufio" //缓存IO
    "fmt"
    "io"
    "io/ioutil" //io 工具包
    "os"
)
//变量
var wireteString = "测试n"
var filename = "./output1.txt"
var f *os.File

//方式一:
f, err1 = os.Create(filename) //创建文件
f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件,可以包含创建

//方式二:ioutil.WriteFile创建并写入:
var d1 = []byte(wireteString) 
err2 := ioutil.WriteFile("./output2.txt", d1, 0666) //写入文件(字节数组)
底层原理:os.WriteFile(filename, data, perm) f = os.OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm) f.Write(data)
复制代码

 

写文件(追加或修改,取决于打开文件的方式)

复制代码
//方式1
n, err1 := io.WriteString(f, wireteString) //写入文件(字符串)

//方式2
var d1 = []byte(wireteString)
n2, err3 := f.Write(d1) //写入文件(字节数组)

//方式3
n3, err3 := f.WriteString("writesn") //写入文件(字节数组)

//方式4
w := bufio.NewWriter(f) //创建新的 Writer 对象
n4, err3 := w.WriteString("bufferedn")
fmt.Printf("写入 %d 个字节n", n4)
w.Flush()
复制代码

 

读文件

复制代码
//方式1:将整个文件读取到内存:
当文件非常大时,尤其在 RAM 存储量不足的情况下,把整个文件都读入内存是没有意义的。更好的方法是分块读取文件。这可以使用 bufio 包来完成。
#1.1
data, err := ioutil.ReadFile("test.txt")
if err != nil {
        fmt.Println("File reading error", err)
        return
}
fmt.Println("Contents of file:", string(data))

#1.2同上
f, err := os.Open("file/test")
if err != nil {
        fmt.Println("read file fail", err)
        return ""
}
defer f.Close()

fd, err := ioutil.ReadAll(f)
if err != nil {
        fmt.Println("read to fd fail", err)
        return ""
}

return string(fd)

//方式2:逐行读取
2.1
file, err := os.Open("app-2019-06-01.log")
if err != nil {
        log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
            lineText := scanner.Text()
}

2.2
file, err := os.Open("filetoread.txt")
if err != nil {
    fmt.Println(err)
    return
}
defer file.Close()

scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanLines)

// 这是我们的缓冲区
var lines []string

for scanner.Scan() {
    lines = append(lines, scanner.Text())
}

fmt.Println("read lines:")
for _, line := range lines {
    fmt.Println(line)
}

//方式3:按字节读取
f, err := os.Open("file/test")

//把file读取到缓冲区中
defer f.Close()
var chunk []byte
buf := make([]byte, 1024)

for {
        //从file读取到buf中
        n, err := f.Read(buf)
        if err != nil && err != io.EOF{
            fmt.Println("read buf fail", err)
            return ""
        }
        //说明读取结束
        if n == 0 {
            break
        }
        //读取到最终的缓冲区中
        chunk = append(chunk, buf[:n]...)
}

return string(chunk)
复制代码

 

posted @   指令跳动  阅读(123)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2016-08-18 bootstrap 源码解析
点击右上角即可分享
微信分享提示