文件操作

  • 读取文件的内容并显示在终端(带缓冲区的方式),使用os.Openfile.Close,bufio.NewReader(),reader.ReadString函数和方法。
package main

import (
"bufio"
"fmt"
"io"
"os"
) func main() {
// 打开一个文件
file, err := os.Open("/home/gocode/src/filedemo/test")
if err != nil{
fmt.Println("open file err=",err)
} defer file.Close() // 要及时关闭文件句柄,否则发有内存泄漏 // 创建一个*Reader,带缓冲区的,默认的缓冲区为4096
reader := bufio.NewReader(file)
// 循环读取文件内容
for{
str, err := reader.ReadString('\n')
if err == io.EOF{ // io.EOF表示文件的末尾
break
}
fmt.Print(str)
}
fmt.Println("文件读取结束")
}
  • 一次将整个文件读取到内存中,这种方式适用于文件不大的情况,相关方法和函数(ioutil.ReadFile

    package main
    
    import (
    "fmt"
    "io/ioutil"
    ) func main() {
    file := "/home/gocode/src/filedemo/test" // 使用ioutil.ReadFile一次性读取
    content, err := ioutil.ReadFile(file) // 返回值是[]byte{}
    if err != nil{
    fmt.Println("read file err:",err)
    } fmt.Println(string(content)) // 需要转换成字符串显示 // 我们没有显示的打开文件,所以也不需要显示的关闭
    // Open()和Close()被封装到ReadFile 函数内部
    }
  • 写文件操作

    (1)创建一个新文件,写入内容5句“hello Gardon”

    // 写入时,使用带缓存的*Writer
    package main import (
    "bufio"
    "fmt"
    "os"
    ) func main() {
    // 创建一个新文件,写入内容5句“hello Gardon”
    filePath := "test.txt"
    file, err := os.OpenFile(filePath,os.O_WRONLY|os.O_CREATE,0666)
    if err != nil{
    fmt.Println("open file err=",err)
    return
    } defer file.Close() // 写入内容5句“hello Gardon”
    str := "hello Gardon\n"
    // 写入时,使用带缓存的*Writer
    writer := bufio.NewWriter(file)
    for i:=0;i<5;i++{
    writer.WriteString(str)
    }
    // 因为writer是带缓存,因此在调用WriteString方法时,其实内容是先写到缓存的
    writer.Flush()
    }

    (2)打开一个存在的文件,将原来的内容覆盖成新的内容10句“你好Christian”

    package main
    
    import (
    "bufio"
    "fmt"
    "os"
    ) func main() {
    filePath := "test.txt"
    file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_TRUNC,0666)
    if err != nil{
    fmt.Println("open file err:",err)
    return
    } defer file.Close() writer := bufio.NewWriter(file) str := "你好Christian\n"
    for i:=0;i<10;i++{
    writer.WriteString(str)
    }
    writer.Flush()
    }

    (3)打开一个存在的文件,在原来的内容追加内容“ABC!ENGLISH”

    package main
    
    import (
    "bufio"
    "fmt"
    "os"
    ) func main() {
    filePath := "test.txt"
    file,err := os.OpenFile(filePath,os.O_WRONLY|os.O_APPEND,0666)
    if err != nil{
    fmt.Println("open file err:",err)
    return
    } defer file.Close() writer := bufio.NewWriter(file) str := "ABC!ENGLISH\n"
    writer.WriteString(str)
    writer.Flush()
    }

    (4)打开一个存在的文件,将原来的内容读出显示在终端,并追加5句“hello 西安”

    package main
    
    import (
    "bufio"
    "fmt"
    "io"
    "os"
    ) func main() {
    filePath := "test.txt"
    file,err := os.OpenFile(filePath,os.O_RDWR|os.O_APPEND,0666)
    if err != nil{
    fmt.Println("open file err:",err)
    return
    } defer file.Close() reader := bufio.NewReader(file)
    for{
    str,err:=reader.ReadString('\n')
    if err == io.EOF{
    break
    }
    fmt.Print(str)
    }
    writer := bufio.NewWriter(file) str := "hello 西安\n"
    for i := 0; i<5;i++{
    writer.WriteString(str)
    }
    writer.Flush()
    }

    (5)将一个文件中的内容写入到另外一个文件中。(判断要写入的文件是否存在)

    package main
    
    import (
    "fmt"
    "io/ioutil"
    "os"
    ) // 判断文件以及文件夹是否存在
    func pathExists(path string) (bool,error){
    _,err := os.Stat(path)
    if err == nil{
    return true,nil
    }
    if os.IsNotExist(err){
    return false,nil
    }
    return false,err
    } func main() {
    file1 := "test.txt"
    file2 := "kkk.txt" content, err := ioutil.ReadFile(file1)
    if err != nil{
    fmt.Printf("read file err=%v\n",err)
    return
    } b,_:= pathExists(file2) // 判断文件是否存在,不存在则创建
    if !b{
    file,err := os.OpenFile(file2,os.O_RDWR|os.O_CREATE,0666)
    if err != nil{
    fmt.Println("create file err:",err)
    return
    }
    defer file.Close()
    } err = ioutil.WriteFile(file2,content,0666)
    if err != nil{
    fmt.Println("write file error=",err)
    return
    }
    }
  • 拷贝文件

    package main
    
    import (
    "bufio"
    "fmt"
    "io"
    "os"
    ) func CopyFile(dstFileName, srcFileName string) (written int64,err error){
    srcFile, err := os.Open(srcFileName)
    if err != nil{
    fmt.Println("open file err:",err)
    return
    } defer srcFile.Close() reader := bufio.NewReader(srcFile) dstFile, err := os.OpenFile(dstFileName,os.O_RDWR|os.O_CREATE,0666)
    if err != nil{
    fmt.Println("open file err:",err)
    return
    } defer dstFile.Close() writer := bufio.NewWriter(dstFile) return io.Copy(writer,reader) // 调用io.Copy()
    } func main() {
    srcFile := "kkk.txt"
    dstFile := "kkkk.txt"
    _, err := CopyFile(dstFile,srcFile)
    if err != nil{
    fmt.Println("copy err:",err)
    }
    }
  • 统计字符出现的次数

    // 打开一个文件,创建一个Reader,每取一行,就去统计有多少个英文,数字,空格和其他字符
    // 将结果保存在结构体中 package main import (
    "bufio"
    "fmt"
    "io"
    "os"
    ) type Charcount struct{
    ChCount int
    NumCount int
    SpaceCount int
    OtherCount int
    } func main() {
    fileName := "kkk.txt"
    file,err := os.Open(fileName)
    if err != nil{
    fmt.Println("open file err:",err)
    return
    }
    defer file.Close() count := Charcount{} reader := bufio.NewReader(file)
    for {
    str,err := reader.ReadString('\n')
    if err == io.EOF{
    break
    }
    for _,v:=range str{
    switch {
    case v >= 'a' && v <= 'z':
    fallthrough
    case v >= 'A' && v <= 'Z':
    count.ChCount += 1
    case v == ' ' || v == '\t':
    count.SpaceCount +=1
    case v >= '0' && v <= '9':
    count.NumCount += 1
    default:
    count.OtherCount += 1
    }
    }
    }
    fmt.Println(count)
    }

Go中的文件操作的更多相关文章

  1. 第32课 Qt中的文件操作

    1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...

  2. 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作

    原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...

  3. 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体

    [源码下载] 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Ap ...

  4. 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

    [源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...

  5. Java中的文件操作(一)RandomAccessFile

    今天,学到的是java中的文件操作. Java.IO.File Java中操作文件用到RandomAccessFile类,既可以读取文件内容,也可以向文件输出数据,但不同与普通输入/输出流的是Rand ...

  6. Win 32平台SDK中的文件操作

    读取文件: HANDLE hFile ; // 声明文件操作内核对象句柄 hFile = CreateFile(, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ...

  7. ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)

    做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...

  8. 关于Python中的文件操作(转)

    总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...

  9. 说说Python 中的文件操作 和 目录操作

    我们知道,文件名.目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名.目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfi ...

  10. C#中的文件操作

    在.NET Framework 中进行的所有输入和输出工作都要用到流(stream) 有两种类型的流: 输出流:当向某些外部目标写入数据时,就要用到输出流(将数据写入到文件中). 输入流:用于将数据读 ...

随机推荐

  1. fs的proxy_media模式失效

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在fs的使用过程中,某些场景只需要对rtp媒体做透传,又不需要任何处理. 在fs1.6的版本中,我们可以使用proxy_media来 ...

  2. 基础命令:dd、tar、ln、find、逻辑符号、alisa别名、md5sun校验、lrzsz文件上传下载、wget

    目录 3.0 dd读取.转换并输出数据 3.1 压缩 (tar.zip).解压缩(tar xf.unzip) 3.2 ln软硬链接 3.2.1 软链接: 3.2.2 硬链接: 3.3 find文件查找 ...

  3. useSyncExternalStore 的应用

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 学而不思则罔,思而不学则殆 . --- <论语 ...

  4. RANSAC---从直线拟合到特征匹配去噪

    Ransac全称为Random Sample Consensus,随机一致性采样.该方法是一种十分高效的数据拟合方法.我们通过最简单的拟合直线任务来了解这种方法思路,继而扩展到特征点匹配中的误点剔除问 ...

  5. 元模型:开启AI哲学思考的数字奇点

    为推广动态模型让AI写的.动态模型和AI非常契合,元模型对AI有意义,所以让AI写更好.元模型其实是非常简单的一个模型,使用XML表示代码如下. <thing name="thing& ...

  6. C#元数据的概念,以及一个使用了lambda表达式的简单例子

    先看一个例子 假设你写了一个 C# 类库 MathUtils.dll: public class Calculator { public int Add(int a, int b) => a + ...

  7. AI可解释性 II | Saliency Maps-based 归因方法(Attribution)论文导读(持续更新)

    AI可解释性 II | Saliency Maps-based 归因方法(Attribution)论文导读(持续更新) 导言 本文作为AI可解释性系列的第二部分,旨在以汉语整理并阅读归因方法(Attr ...

  8. 洛谷P4198 楼房重建 题解

    Part1.自己一开始是怎么想的 我一开始的想法是先考虑什么情况下是看不见的. 如果是 \(i < j\) 的话可以直接看 \(j\) 的斜率和 \(i\) 的斜率就是比较 \(\frac{h_ ...

  9. vue-element-admin整合服务端代理api

    1. 找到vue.config.js,在devServer中编辑如下 devServer: { port: port, open: true, overlay: { warnings: false, ...

  10. 康谋分享 | 汽车仿真与AI的结合应用

    在自动驾驶领域,实现高质量的虚拟传感器输出是一项关键的挑战.所有的架构和实现都会涉及来自质量.性能和功能集成等方面的需求.aiSim也不例外,因此我们会更加关注于多个因素的协调,其中,aiSim传感器 ...