golang文件读写之ioutil方法
使用golang语言去读写一个文件会有多种方式,这里先从io/ioutil包开始。io/ioutil包提供了以下函数供用户调用:
1[root@localhost ~]# godoc io/ioutil|grep "func.*("
2func NopCloser(r io.Reader) io.ReadCloser
3func ReadAll(r io.Reader) ([]byte, error)
4func ReadDir(dirname string) ([]os.FileInfo, error)
5func ReadFile(filename string) ([]byte, error)
6func TempDir(dir, prefix string) (name string, err error)
7func TempFile(dir, prefix string) (f *os.File, err error)
8func WriteFile(filename string, data []byte, perm os.FileMode) error
一、文件读取
从上面的godoc帮助文档中,可以看到ReadAll和ReadFile方法是用于文件读取的,两者所不同的是传的参不一样,一个io对象,一个是文件名,但最终返回的都是一个byte类型的数据。
1/*
2code from www.361way.com
3read whole file use ReadFile func
4*/
5package main
6import (
7 "fmt"
8 "io/ioutil"
9 //"strings"
10)
11func main() {
12 Ioutil("/etc/passwd")
13}
14func Ioutil(name string) {
15 if contents, err := ioutil.ReadFile(name); err == nil {
16 if len(contents) > 0 {
17 s := contents[:len(contents)-1]
18 fmt.Println(string(s))
19 } else {
20 fmt.Println(string(contents))
21 }
22 }
23}
上面的读取的结果默认会多一个换行,如果认为无影响,可以直接if contents, err := ioutil.ReadFile(name); err nil读取后就Println结果就行了。结果想要处理就可以加上上面的判断语句进行处理,因为考虑到直接touch创建的空文件len(contents)是0,进行切片时会越界。
很多网上找到的代码是result := strings.Replace(string(contents), “\n”, “”, 1) 使用这样的语句处理多出来的一行的,这个处理是不正确的,这个会把第一个换行替换为空。多行的文件,会将第一二行合并在一起,而且最后打印出的内容也多出一个空行。这点和python不同,其不支持 -1 替换,所以重好用上面的方法进行处理。
二、写文件
1package main
2import (
3 "fmt"
4 "io/ioutil"
5)
6func main() {
7 name := "testwritefile.txt"
8 content := "Hello, www.361way.com!\n"
9 WriteWithIoutil(name,content)
10}
11//使用ioutil.WriteFile方式写入文件,是将[]byte内容写入文件,如果content字符串中没有换行符的话,默认就不会有换行符
12func WriteWithIoutil(name,content string) {
13 data := []byte(content)
14 if ioutil.WriteFile(name,data,0666) == nil {
15 fmt.Println("写入文件成功:",content)
16 }
17 }
以下点需要注意下:
1、如果文件存在,则是覆盖写入,不是追加写入;
2、这里的设置的权限0666经测试发现并不生效,其最终文件权限是受umask值影响的。如果默认umask是002,则写入后文件的权限是644。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/ioutil-rwfile/5872.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.