文档章节

go语言学习-文件读写 io os ioutil

solate
 solate
发布于 2016/07/28 17:54
字数 893
阅读 705
收藏 0

文件读写

os 打开文件,创建文件

  1. func Create(name string) (file *File, err error) 创建新文件,如果文件已存在,将被截断。新建的文件是可读写的。默认权限为0666(Linux 下文件的权限设置格式)。
  2. func Open(name string) (file *File, err error) 打开已经存在的文件,用来读取文件内容。Open 打开的文件是只读的。不能写。
  3. func OpenFile(name string, flag int, perm FileMode) (file *File, err error)OpenFile 是一个通用的函数,可以用来创建文件,以只读方式打开文件,以读写方式打开文件等
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	/*打开文件 ,如果文件不存在将会新建,如果已存在,新写入的内容将追加到文件尾
	os.O_RDONLY : 如果设置为只读,那么将写入不了数据
	os.O_RDWR : 设置为读写
	*/
	f, err := os.OpenFile("./test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	f.WriteString("test a string!")


	buf := make([]byte, 1024)
	var str string
	/*重置文件指针,否则读不到内容的。*/
	f.Seek(0, os.SEEK_SET)
	for {
		n, ferr := f.Read(buf)
		if ferr != nil && ferr != io.EOF {
			fmt.Println(ferr.Error())
			break
		}
		if n == 0 {
			break
		}
		fmt.Println(n)
		str += string(buf[0:n])
	}
	fmt.Println(str)
}

file

1.func (f *File) Seek(offset int64, whence int) (ret int64, err error) Seek 用来设置文件指针的位置,offet 是偏移量,whence 的取值可以是下面的三个: SEEK_SET 相对文件开始偏移 SEEK_CUR 相对文件当前位置偏移 SEEK_END 相对文件末尾偏移

ioutil

1.func ReadAll(r io.Reader) ([]byte, error) 从 r 中读取所有内容

package main

import (
	"fmt"
	"os"
	"io/ioutil"
)

func main() {
	f, err := os.OpenFile("./test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	//f.WriteString("test a string!")

	buf, err := ioutil.ReadAll(f)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(buf))
}

2.func ReadFile(filename string) ([]byte, error) 从文件 filename 中读取内容,一次性读取整个文件,成功 error=nil。

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	buf, err := ioutil.ReadFile("./test.txt")
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println(string(buf))
}

3.func WriteFile(filename string, data []byte, perm os.FileMode) error 向文件中写数据,如果文件不存在,将以 perm 权限创建文件。

//如果原来文件有内容,则会删除覆盖掉

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	err := ioutil.WriteFile("./test.txt", []byte("abcdefg"), 0777)
	if err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println("OK")
	}
}

遍历目录下文件

OpenFile 除了可以打开文件,还可以打开一个目录。在 File 对像有一个 Readdir 函数,用来读取某目录下的所有文件和目录信息,位于 OS 包中.

os

1.func (f *File) Readdir(n int) (fi []FileInfo, err error) n>0 最多返回 n 个文件。如个小于等零,返回所有的。

filepath.Walk 也是用 Readdir 来实现的

package main

import (
	"fmt"
	"os"
)

func main() {
	f, err := os.OpenFile("./", os.O_RDONLY, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	arrFile, err1 := f.Readdir(0)
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	for k, v := range arrFile {
		fmt.Println(k, "\t", v.Name(), "\t", v.IsDir())
	}
}

ioutil

1.func ReadDir(dirname string) ([]os.FileInfo, error) 读取目录下所有的文件和子目录

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	arrFile, err := ioutil.ReadDir("./")
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	for k, v := range arrFile {
		fmt.Println(k, "\t", v.Name(), "\t", v.IsDir())
	}
}

gob 序列化

序列化就是将对象的状态信息转换为可以存储或传输的形式的过程。

Gob 是 Go 中所特有的序列化技术,它支持除 interface,function,channel 外的所有 Go 数 据类型。序列化使用 Encoder,反序列化使用 Decoder。

package main

import (
	"encoding/gob"
	"fmt"
	"os"
)

type Student struct {
	Name string
	Age  int
}

func main() {
	s := &Student{"张三", 19}
	f, err := os.Create("data.dat")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	//创建 Encoder 对像
	encode := gob.NewEncoder(f)
	//将s序列化到f文件中
	encode.Encode(s)

	//重置文件指针到开始位置
	f.Seek(0, os.SEEK_SET)

	decoder := gob.NewDecoder(f)
	var s1 Student
	//反序列化对像
	decoder.Decode(&s1)
	fmt.Println(s1)
}

© 著作权归作者所有

共有 人打赏支持
solate
粉丝 8
博文 123
码字总数 107428
作品 0
成都
程序员
私信 提问
Go学习笔记二: 函数,文件操作及网络通信

Go学习笔记二: 函数,文件操作及网络通信 1.引言 在《Go学习笔记一》中,我对Go语言中的基础数据类型、控制结构做了总结,该篇笔记的动机来源于我实际工作中利用Go解决一些小问题。问题本身...

西昆仑
2016/05/29
86
0
Golang 学习笔记(08)—— 文件操作

本文为转载,原文:Golang 学习笔记(08)—— 文件操作 path 在path包中封装了一些路径相关的操作,在开始接触文件操作之前,我们先看看路径的相关函数。在Linux中,路径的格式为/user/bin...

ChainZhang
2018/01/02
0
0
go client http post upload上传及 server 参数获取

go upload 遇到的问题 首先需要知道client是如何通过 http 协议 实现信息和参数的传递,以及server是怎么接受参数. 可以看两篇博客 : Go发起Http请求及获取相关参数 golang web开发获取get、...

solate
2016/09/01
538
2
Golang通过自定义函数实现模板的包含

import ("html/template""log""os""io/ioutil")func main() {s := ParseTmplateToStr("src/1.html")t, _ := template.New("test").Funcs(template.FuncMap{"Parse": ParseTmplateToStr }).Pa......

ReliefZkk
2014/09/13
0
0
secondriver/go-box

Go-Box Go语言实践, 归档go语言开发,应用,代码包,帮助文档,学习资料 环境 Go SDK "下载" Go 开发工具LiteIDE "LiteIDE 是一款简单、开源、跨平台的 Go 语言 IDE" Go 环境搭建 应用 warm...

secondriver
2015/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:线程间频繁切换为什么耗费资源?

因为线程切换的时候,CPU需要将此线程的所有执行状态保存起来,如线程编号,执行到的位置等,然后再去执行其它线程。

浮躁的码农
28分钟前
0
0
PHP版本高于5.5时,curl文件上传必须使用CurlFile对象

坑了我一天,之前@的方法各种上传不成功文件。都怀疑服务端有bug了。

叫我哀木涕
29分钟前
1
0
js算法总结

数列求和 等差数列求和 function sum(a0,d,n){//a0->首项,d->公差,n->项数//(首项+末项)*项数/2return (a1+(a1+d*n))*n/2;} 等比数列求和 function sum(a0,q,n){//a0->首项,q->公......

祖达
54分钟前
2
0
小白?转型?毕业生?外行学习快速入行大数据开发指南

这篇文章中,本文将针对三种不同的、想要进入数据科学领域的人群,给出自己的经验,帮助他们迅速有效入行。 虽然没有适合每个人的万能解决方案,但这三类建议值得想转行的你一看。 第1类:新...

董黎明
今天
2
0
好文 | MySQL 索引B+树原理,以及建索引的几大原则

MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 ...

Java爬坑之路
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部