广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GO文件创建及读写操作示例详解
  • 903
分享到

GO文件创建及读写操作示例详解

2024-04-02 19:04:59 903人浏览 泡泡鱼
摘要

目录三种文件操作比较ioutilioutil.ReadFile读ioutil.WriteFile 写ioutil.ReadAll 读ioutil.ReadDir 查看路径下目录信息i

三种文件操作比较

ioutil
bufio
os.File

当文件较小(KB 级别)时,ioutil > bufio > os。
当文件大小比较常规(MB 级别)时,三者差别不大,但 bufio 又是已经显现出来。
当文件较大(GB 级别)时,bufio > os > ioutil。

ioutil

ioutil.ReadFile读

//读
func Ioutil_read() {
	file, _ := ioutil.ReadFile("./write.txt")
	fmt.Println(string(file))
}

ioutil.WriteFile 写

//写
func Ioutil_write()  {
	ioutil.WriteFile("./write.txt",[]byte("aaaa\nbbb\ncccc\n啦啦啦啦"),0777)
}

ioutil.ReadAll 读

// 比较浪费内存,解决方法,百度查询
file,_ := os.Open("./write.txt")
b,_:=ioutil.ReadAll(file)
fmt.Println(string(b))

ioutil.ReadDir 查看路径下目录信息

func Ioutil_ReadDir()  {
	dir,_:=ioutil.ReadDir("./")
	for _,file := range dir{
		fmt.Println(file.Name())  //文件名字
		fmt.Println(file.Size())  //文件大小
		fmt.Println(file.IsDir())  //判断是否为目录
		fmt.Println(file.Mode())  //查看读写权限-rw-r--r--
		fmt.Println(file.ModTime())  //文件创建时间
	}
}

ioutil.TempDir 创建临时目录

// 创建临时目录,以jeff开头,eg:jeff0123755
func Ioutil_Tempdir()  {
	path,_ := ioutil.TempDir("./","jeff")
	fmt.Println(path)  //返回临时目录路径
}

ioutil.TempFile 创建临时文件

// 创建临时文件,以jeff开头,eg:jeff067576
func Ioutil_file()  {
	//以读写模式打开该文件并返回os.File指针
	path,_:=ioutil.TempFile("./","jeff")
	fmt.Println(path) //返回os.File指针
}

os.file

方法

os.Create() //创建文件,如果有该文件则会清空文件
os.Open()  // 只读方式打开文件
os.OpenFile(文件名,打开方式,打开权限)
Write() //写入
Read()  //读取

os.OpenFile()

OpenFile( )这个函数有三个参数

第一个参数表示打开文件的路径

第二个参数表示模式,常见的模式有

O_RDONLY(只读模式),

O_WRONLY(只写模式),

O_RDWR(可读可写模式),

O_APPEND(追加模式)。

第三个参数,表示权限,取值范围(0-7)

表示如下:

0:没有任何权限
1:执行权限(如果是可执行文件,是可以运行的)
2:写权限
3:写权限与执行权限
4:读权限
5:读权限与执行权限
6:读权限与写权限
7:读权限,写权限,执行权限

fp,err := os.OpenFile("D:/a.txt",os.O_RDWR,6)
if err!=nil {
    fmt.Println("打开文件失败")
}
fp.WriteString("hello")
fp.WriteAt([]byte("hello"),25)
defer fp.Close()

创建文件

将数据存储到文件之前,先要创建文件。Go语言中提供了一个Create( )函数专门创建文件.

该函数在创建文件时,首先会判断要创建的文件是否存在,如果不存在,则创建,如果存在,会先将文件中已有的数据清空。

同时,当文件创建成功后,该文件会默认的打开,所以不用在执行打开操作,可以直接向该文件中写入数据。

创建文件的步骤:

(1)导入“os”包,创建文件,读写文件的函数都在该包

(2)指定创建的文件存放路径以及文件名。

(3)执行Create( )函数,进行文件创建

(4)关闭文件

具体代码:

package main
import (
    "fmt"
    "os"
)
func main() {
    //os.Create(文件名) 文件名  可以写绝对路径和相对路径
    //返回值  文件指针 错误信息
    fp,err := os.Create("./a.txt")
    if err!=nil{
        //文件创建失败
        
        fmt.Println("文件创建失败")
        return
    }
    //读写文件
    defer fp.Close()
    //关闭文件
    //如果打开文件不关闭 造成内存的浪费  程序打开文件的上限
    //fp.Close()
}

写入数据三种方式

第一种-WriteString( )函数

WriteString( )方法默认返回两个参数,第一个参数,指的是写入文件的数据长度,第二个参数记录的是错误信息
WriteString( )方法默认写到文件中的数据是不换行的。如果想换行,可以采用如下的方式:
//\n不会换行  原因 在windows文本文件中换行\r\n  回车  在linux中换行\n
fp.WriteString("hello world\r\n")
fp.WriteString("性感荷官在线发牌")

文件打开以后,可以向文件中写数据,可以使用WriteString( )方法。

//\反斜杠 转义字符
//在写路径时可以使用/正斜杠代替\反斜杠
fp,err := os.Create("D:/a.txt")
if err!=nil{
    //文件创建失败
    
    fmt.Println("文件创建失败")
    return
}
//写文件
//\n不会换行  原因 在windows文本文件中换行\r\n  回车  在linux中换行\n
fp.WriteString("hello world\r\n")
fp.WriteString("性感荷官在线发牌")
defer fp.Close()
//关闭文件
//如果打开文件不关闭 造成内存的浪费  程序打开文件的上限
//fp.Close()

第二种-Write( )函数

在这里要注意的是,使用Write( )函数写数据时,参数为字节切片,所以需要将字符串转换成字节切片。该方法返回的也是写入文件数据的长度

fp,err := os.Create("D:/a.txt")
if err!=nil{
    //文件创建失败
    
    fmt.Println("文件创建失败")
    return
}
//写操作
//slice := []byte{'h','e','l','l','o'}
//count,err1 := fp.Write(slice)
count,err1 := fp.Write([]byte("性感老王在线授课"))

if err1!=nil {
    fmt.Println("写入文件失败")
    return
}else {
    fmt.Println(count)
}
defer fp.Close()

第三种-WriteAt( )函数

在指定的位置写入数据,以下程序中Seek( )函数返回值存储到变量n中,值为文件末尾的位置。WriteAt( )也返回的是写入的数据长度。

fp,err := os.Create("D:/a.txt")
if err!=nil{
    //文件创建失败
    
    fmt.Println("文件创建失败")
    return
}
//写操作
//获取光标流位置'
//获取文件起始到结尾有多少个字符
//count,_:=fp.Seek(0,os.SEEK_END)
count,_:=fp.Seek(0,io.SeekEnd)
fmt.Println(count)
//指定位置写入
fp.WriteAt([]byte("hello world"),count)
fp.WriteAt([]byte("hahaha"),0)
fp.WriteAt([]byte("秀儿"),19)
defer fp.Close()

读取文件

Read 读取文件

如果文件已经存在,并且也已经有数据了,那么可以直接读取该文件中的内容。

读取文件的基本流程如下:

(1)打开要读取的文件

(2)对文件进行读取

(3)关闭文件

在向文件中写数据的时候,使用的是Write,那么读取文件中的数据,使用的是Read.

关于Read( )函数的使用如下:

package main

import (
    "fmt"
    "io"
    "os"
)
func main() {

    //打开文件
    fp, err := os.Open("D:/a.txt")
    if err != nil {
        fmt.Println("err=", err)
        return
    }

    buf := make([]byte, 1024*2) //2k大小
    //n代表从文件读取内容的长度
    n, err1 := fp.Read(buf)
    if err1 != nil && err1 != io.EOF {
        fmt.Println("err1=", err1)
        return
    }
    fmt.Println("buf=", string(buf[:n]))

    //关闭文件
    defer fp.Close()

}

Open( )是打开文件,与OpenFile( )的区别是,Open( )只有读的权限

在使用Read( )函数读取文件中的内容时,需要一个切片类型,而定义切片时类型为字符数组,将文件中的内容保存在切片中,同时除了对其判断是否出错时以外,还要判断是否到文件末尾(这里需要导入io包)。

Read( )函数返回的是从文件中读取的数据的长度。最后,输出切片中存储的文件数据,注意,读取的是从最开始到整个数据长度,因为有可能存储到切片中的数据达不到切片的总长度(也是切片时2k,但是从文件中读取的数据有可能只有1k)

按行读取

上面我们是将文件的内容全部读取出来,然后存放在切片中,我们也可以每次只读取一行数据。

这需要用到bufio包中的ReadBytes函数。具体如下:

1:打开文件

fp, err := os.Open("D:/a.txt")
if err != nil {
    fmt.Println("打开文件失败", err)
    return
}

2:创建缓冲区

在使用ReadBytes( )函数读取数据时,需要用到缓冲区,所谓缓冲区就是存储数据的区域,也就是先将从文件中读取的数据存储在该区域内,然后在将区域中的数据取出来,写到磁盘上。提供缓冲区的原因是:

为了缓和 CPU 与磁盘设备之间速度不匹配矛盾。文件缓冲区是用以暂时存放读写期间的文件数据而在内存区预留的一定空间。

//创建文件缓冲区
r := bufio.NewReader(fp)

3:循环读取文件中的内容,直到文件末尾位置。

for {
    //遇到'\n'结束读取,但是'\n'也读取进入
    buf,err := r.ReadBytes('\n')
    fmt.Println("buf = ",string(buf))
    if err != nil {
        if err == io.EOF {
            break
        }
        fmt.Println("err=",err)
    }
}

在使用ReadBytes( )函数时,传递的参数是‘\n’,表示遇到’\n’就结束,所以使用了死循环(每循环一次,读取一行数据),只有到文件末尾了,才退出整个循环。最后,将读取的数据打印出来,注意ReadBytes( )返回的是字节切片,所以在打印时要转换成字符串。

4:最后关闭文件

//关闭文件
defer fp.Close()

现在我们已经完成了文件的创建,读取,以及将数据保存到文件的操作,在对文件操作时,我们需要指定文件的路径。

关于路径,有两种情况:

第一:相对路径,所谓相对路径指的是文件相对于应用程序的路径。例如:上面我们一只使用的a.txt,这个文件,该文件存放的位置与可执行文件存储的路径是一样的。

第二:绝对路径:指的是通过给定的这个路径直接能在我的电脑中找到这个文件。例如:D:\Info.txt,

  • 建议我们以后在开发中使用相对路径

文件操作案例

文件拷贝,将已有的文件复制一份,同时重新命名。

基本的思路:

(1)让用户输入要拷贝的文件的名称(源文件)以及目的文件的名称

(2)创建目的文件

(3)打开源文件,并且读取该文件中的内容

(4)将从源文件中读取的内容写到目的文件中。

var srcFileName string
var dstFileName string
fmt.Printf("请输入源文件名称:")
fmt.Scan(&srcFileName)
fmt.Println("请输入目的文件名称:")
fmt.Scan(&dstFileName)
if srcFileName == dstFileName {
    fmt.Println("源文件和目的文件名字不能相同")
    return
}
//只读方式打开源文件
sF,err1 := os.Open(srcFileName)
if err1 != nil {
    fmt.Println("err1=",err1)
    return
}
//新建目的文件
dF,err2 := os.Create(dstFileName)
if err2 != nil{
    fmt.Println("err2=",err2)
    return
}
//操作完毕,需要关闭文件
defer sF.Close()
defer dF.Close()
//核心处理,从源文件读取内容,往目的文件写,读多少写多少
buf := make([]byte,4*1024)//4k大小临时缓冲区
for{
    n,err := sF.Read(buf)//从源文件读取内容,每次读取一部分
    if err != nil{
        fmt.Println("err=",err)
        if err == io.EOF{//文件读取完毕
            break
        }
    }
    //往目的文件写,读多少写多少
    dF.Write(buf[:n])
}

以上就是GO文件创建及读写操作示例详解的详细内容,更多关于GO文件创建读写操作的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: GO文件创建及读写操作示例详解

本文链接: https://www.lsjlt.com/news/146043.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • GO文件创建及读写操作示例详解
    目录三种文件操作比较ioutilioutil.ReadFile读ioutil.WriteFile 写ioutil.ReadAll 读ioutil.ReadDir 查看路径下目录信息i...
    99+
    2022-11-13
  • GO文件创建及读写操作的方法
    本文小编为大家详细介绍“GO文件创建及读写操作的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“GO文件创建及读写操作的方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。三种文件操作比较ioutilbufio...
    99+
    2023-06-30
  • Go语言文件开关及读写操作示例
    目录⛳️ 实战场景打开关闭文件读取文件bufio 读取文件写文件⛳️ 实战场景 本篇博客为大家再次带来 Go 语言的基础知识,这次要学习的内容是 Go 中的文件操作。 打开关闭文件 ...
    99+
    2022-11-11
  • Go语言文件读写操作案例详解
    目录基本介绍文件基本操作读操作写操作写操作案例查看文件或目录是否存在拷贝文件基本介绍 文件,对我们并不陌生,文件是数据源(保存数据的地方)的 一种 输入流和输出流 文件在程序中是以流...
    99+
    2022-11-11
  • Go读写锁操作方法示例详解
    目录引言读写锁有很多方法读操作写操作引言 前面讲到,在资源竞争的时候可以使用互斥锁,保证了资源访问的唯一性,但也降低了性能,仔细分析一下场景,如果只是读取数据,无论多少个gorout...
    99+
    2022-11-13
  • python 文件读写操作示例源码解读
    目录文件写操作的案例代码解释在Python中,可以使用以下三种方法来读取文件文件写操作的案例 # 打开文件(只写模式) file = open('example.txt', 'w'...
    99+
    2023-03-24
    python 文件读写操作解读 python 文件读写源码解读
  • java文件读写操作实例详解
    目录File类File类的构造方法创建功能判断获取删除IO流字节流写数据小问题总结File类 它是文件和目录路径名的抽象表示。 文件和目录是可以通过File封装成对象的。 对于Fil...
    99+
    2022-11-13
  • JAVA文件读写操作详解
    目录一、读文件BufferedInputStream二、写文件BufferedOutputStream三、实际应用场景总结一、读文件BufferedInputStream Buffe...
    99+
    2022-11-13
  • C++文件读写操作详解
    目录一、读写文本文件1.1 写文件1.2读文件二、读写二进制文件2.1 写文件2.2 读文件一、读写文本文件 1.1 写文件 写文件步骤如下: 包含头文件 #include <...
    99+
    2022-11-13
  • JavaZip文件读写操作详解
    输入流(读取): ZipInputStream是一种FileInputStream流,它可以直接读取Zip压缩包的内容: ┌───────────────────┐│   ...
    99+
    2022-11-13
    Java Zip文件读取 Java Zip文件写入
  • C++ 二进制文件读写方式及示例详解
    目录C++ 二进制文件读写一、二进制文件的读写方式二、C++二进制文件读写示例写入二进制文件:读取二进制文件:总结:C++ 二进制文件读写 C++语言提供了使用二进制文件进行数据处理...
    99+
    2023-05-17
    C++ 二进制文件读写 C++ 文件读写
  • Node.js Streams文件读写操作详解
    Node.js 天生异步和事件驱动,非常适合处理 I/O 相关的任务。如果你在处理应用中 I/O 相关的操作,你可以利用 Node.js 中的流(stream)。因此,我们先具体看看流,理解一下它们是怎么简...
    99+
    2022-06-04
    详解 操作 文件
  • PythonYAML文件的读写操作详解
    目录YAML格式YAML文件YAML操作读取存储示例转字典转列表YAML是一种数据序列化格式,方便人类阅读,且容易和脚本语言交互。常用于配置文件,也用于数据存储或传输。 YAML格式...
    99+
    2022-11-11
  • C++文件流读写操作详解
    目录1.打开文件1.1 fstream类型1.2 open()的函数原型1.3 打开方式1.4 打开文件的属性1.5 示例代码2.文本文件的读写2.1 写文件示例2.2 读文件示例2...
    99+
    2022-11-12
  • Go语言学习笔记之文件读写操作详解
    目录文件写文件读小结文件操作比较多,分为几篇来写吧。首先是文件的读写,在平时的工程化操作中使用最多。 文件写 样例代码如下 package main import ( "...
    99+
    2022-11-13
  • Go语言基础Json序列化反序列化及文件读写示例详解
    目录概述JSON序列化结构体转JSONmap转JSON切片转JSONJSON反序列化JSON转mapJSON转结构体JSON转切片写JSON文件map写入JSON文件切片写入JSON...
    99+
    2022-11-12
  • Java读写锁ReadWriteLock的创建使用及测试分析示例详解
    目录简介基本方法介绍创建读写锁使用读锁readLock().lock()使用读锁readLock().tryLock();readLock().tryLock(6L, TimeUni...
    99+
    2023-01-12
    Java读写锁ReadWriteLock Java ReadWriteLock
  • java进行文件读写操作详解
    在Java中,文件读写操作可以使用Java的输入/输出流(IO)类来实现。Java提供了多种IO类来进行文件读写操作,包括字节流和字...
    99+
    2023-09-14
    java
  • Python读写JSON文件的操作详解
    目录JSONJSON 起源JSON 样例Python 原生支持 JSON序列化 JSON简单的序列化示例JSON 反序列化简单的反序列化示例应用案例编码和解码JSON JSON 起源...
    99+
    2022-11-10
  • Pandas对CSV文件读写操作详解
    目录什么是 CSV 文件CSV 库解析 CSV 文件读取 CSV 文件CSV reader 参数CSV 文件的写入使用 pandas 库解析 CSV 文件pandas 读取 CSV ...
    99+
    2022-11-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作