Go中的文件操作
文件操作
- 读取文件的内容并显示在终端(带缓冲区的方式),使用
os.Open,file.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中的文件操作的更多相关文章
- 第32课 Qt中的文件操作
1. Qt的中IO操作 (1)Qt中IO操作的处理方式 ①Qt通过统一的接口简化了文件和外部设备的操作方式 ②Qt中的文件被看作一种特殊的外部设备 ③Qt中的文件操作与外部设备的操作相同 (2)IO操 ...
- 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作
原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...
- 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体
[源码下载] 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Ap ...
- 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理
[源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...
- Java中的文件操作(一)RandomAccessFile
今天,学到的是java中的文件操作. Java.IO.File Java中操作文件用到RandomAccessFile类,既可以读取文件内容,也可以向文件输出数据,但不同与普通输入/输出流的是Rand ...
- Win 32平台SDK中的文件操作
读取文件: HANDLE hFile ; // 声明文件操作内核对象句柄 hFile = CreateFile(, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ...
- ASP.NET中的文件操作(文件信息,新建,移动,复制,重命名,上传,遍历)(亲测详细)
做了几天的文件操作,现在来总结一下,错误之处,还望指点!以文件为例,如果对文件夹操作,基本上将File换为Directory即可(例:FileInfo file = new FileInfo(Path ...
- 关于Python中的文件操作(转)
总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理一下吧: python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Pyth ...
- 说说Python 中的文件操作 和 目录操作
我们知道,文件名.目录名和链接名都是用一个字符串作为其标识符的,但是给我们一个标识符,我们该如何确定它所指的到底是常规文件文件名.目录名还是链接名呢?这时,我们可以使用os.path模块提供的isfi ...
- C#中的文件操作
在.NET Framework 中进行的所有输入和输出工作都要用到流(stream) 有两种类型的流: 输出流:当向某些外部目标写入数据时,就要用到输出流(将数据写入到文件中). 输入流:用于将数据读 ...
随机推荐
- fs的proxy_media模式失效
概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在fs的使用过程中,某些场景只需要对rtp媒体做透传,又不需要任何处理. 在fs1.6的版本中,我们可以使用proxy_media来 ...
- 基础命令: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文件查找 ...
- useSyncExternalStore 的应用
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 学而不思则罔,思而不学则殆 . --- <论语 ...
- RANSAC---从直线拟合到特征匹配去噪
Ransac全称为Random Sample Consensus,随机一致性采样.该方法是一种十分高效的数据拟合方法.我们通过最简单的拟合直线任务来了解这种方法思路,继而扩展到特征点匹配中的误点剔除问 ...
- 元模型:开启AI哲学思考的数字奇点
为推广动态模型让AI写的.动态模型和AI非常契合,元模型对AI有意义,所以让AI写更好.元模型其实是非常简单的一个模型,使用XML表示代码如下. <thing name="thing& ...
- C#元数据的概念,以及一个使用了lambda表达式的简单例子
先看一个例子 假设你写了一个 C# 类库 MathUtils.dll: public class Calculator { public int Add(int a, int b) => a + ...
- AI可解释性 II | Saliency Maps-based 归因方法(Attribution)论文导读(持续更新)
AI可解释性 II | Saliency Maps-based 归因方法(Attribution)论文导读(持续更新) 导言 本文作为AI可解释性系列的第二部分,旨在以汉语整理并阅读归因方法(Attr ...
- 洛谷P4198 楼房重建 题解
Part1.自己一开始是怎么想的 我一开始的想法是先考虑什么情况下是看不见的. 如果是 \(i < j\) 的话可以直接看 \(j\) 的斜率和 \(i\) 的斜率就是比较 \(\frac{h_ ...
- vue-element-admin整合服务端代理api
1. 找到vue.config.js,在devServer中编辑如下 devServer: { port: port, open: true, overlay: { warnings: false, ...
- 康谋分享 | 汽车仿真与AI的结合应用
在自动驾驶领域,实现高质量的虚拟传感器输出是一项关键的挑战.所有的架构和实现都会涉及来自质量.性能和功能集成等方面的需求.aiSim也不例外,因此我们会更加关注于多个因素的协调,其中,aiSim传感器 ...