golang文件读写之ioutil方法

2018年2月12日 发表评论 阅读评论

使用golang语言去读写一个文件会有多种方式,这里先从io/ioutil包开始。io/ioutil包提供了以下函数供用户调用:

[root@localhost ~]# godoc io/ioutil|grep "func.*("
func NopCloser(r io.Reader) io.ReadCloser
func ReadAll(r io.Reader) ([]byte, error)
func ReadDir(dirname string) ([]os.FileInfo, error)
func ReadFile(filename string) ([]byte, error)
func TempDir(dir, prefix string) (name string, err error)
func TempFile(dir, prefix string) (f *os.File, err error)
func WriteFile(filename string, data []byte, perm os.FileMode) error

一、文件读取

从上面的godoc帮助文档中,可以看到ReadAll和ReadFile方法是用于文件读取的,两者所不同的是传的参不一样,一个io对象,一个是文件名,但最终返回的都是一个byte类型的数据。

/*
code from www.361way.com
read whole file use ReadFile func
*/
package main
import (
	"fmt"
	"io/ioutil"
	//"strings"
)
func main() {
	Ioutil("/etc/passwd")
}
func Ioutil(name string) {
	if contents, err := ioutil.ReadFile(name); err == nil {
		if len(contents) > 0 {
			s := contents[:len(contents)-1]
			fmt.Println(string(s))
		} else {
			fmt.Println(string(contents))
		}
	}
}

上面的读取的结果默认会多一个换行,如果认为无影响,可以直接if contents, err := ioutil.ReadFile(name); err == nil读取后就Println结果就行了。结果想要处理就可以加上上面的判断语句进行处理,因为考虑到直接touch创建的空文件len(contents)是0,进行切片时会越界。

很多网上找到的代码是result := strings.Replace(string(contents), "\n", "", 1) 使用这样的语句处理多出来的一行的,这个处理是不正确的,这个会把第一个换行替换为空。多行的文件,会将第一二行合并在一起,而且最后打印出的内容也多出一个空行。这点和python不同,其不支持 -1 替换,所以重好用上面的方法进行处理。

二、写文件

package main
import (
    "fmt"
    "io/ioutil"
)
func main() {
      name := "testwritefile.txt"
      content := "Hello, www.361way.com!\n"
      WriteWithIoutil(name,content)
}
//使用ioutil.WriteFile方式写入文件,是将[]byte内容写入文件,如果content字符串中没有换行符的话,默认就不会有换行符
func WriteWithIoutil(name,content string) {
    data :=  []byte(content)
    if ioutil.WriteFile(name,data,0666) == nil {
        fmt.Println("写入文件成功:",content)
        }
    }

以下点需要注意下:

1、如果文件存在,则是覆盖写入,不是追加写入;

2、这里的设置的权限0666经测试发现并不生效,其最终文件权限是受umask值影响的。如果默认umask是002,则写入后文件的权限是644。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 2018年11月19日18:05 | #1