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