go语言学习-文件读写 io os ioutil
2016-07-28 00:00
309 查看
文件读写
os 打开文件,创建文件
func Create(name string) (file *File, err error) 创建新文件,如果文件已存在,将被截断。新建的文件是可读写的。默认权限为0666(Linux 下文件的权限设置格式)。func Open(name string) (file *File, err error) 打开已经存在的文件,用来读取文件内容。Open 打开的文件是只读的。不能写。
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) }
相关文章推荐
- go slice 第三个参数是容量
- UVa 11090 Going in Cycle!!(环上平均值最大+SPFA DFS判负环)
- go 语言学习历程
- Django vs2015 学习开发日记1
- Go基础篇之一
- poj_2195Going Home(最小费用最大流)
- Rust 1.0发布一周年,发展回顾与总结
- 第3课 Go控制,循环,选择,跳转语句
- 模仿绘画风格的算法:A Neural Algorithm of Artistic Style
- django简单入门
- poj 3622 Gourmet Grazers 挑剔的美食家(贪心)
- POJ2007 Scrambled Polygon
- Django1.8教程——安装Django
- Google hacker工具使用和Google hacker防范
- 设计模式GOF23——开篇
- golang积累-记忆闭包
- POJ2007 Scrambled Polygon 凸多边形顶点输出
- history.back(-1)和history.go(-1)的区别
- 使用Google ZXing实现二维码的扫描和生成相关功能体系
- 第2课 Go类型、变量、常量、运算符