golang 读取文件的四种方式
读文件
读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件
读文件方式一:利用ioutil.readfile直接从文件读取到[]byte中
func read0() (string){ f, err := ioutil.readfile("file/test") if err != nil { fmt.println("read fail", err) } return string(f)}
读文件方式二:先从文件读取到file中,在从file读取到buf, buf在追加到最终的[]byte
func read1() (string){ //获得一个file f, err := os.open("file/test") if err != nil { fmt.println("read fail") return "" } //把file读取到缓冲区中 defer f.close() var chunk []byte buf := make([]byte, 1024) for { //从file读取到buf中 n, err := f.read(buf) if err != nil && err != io.eof{ fmt.println("read buf fail", err) return "" } //说明读取结束 if n == 0 { break } //读取到最终的缓冲区中 chunk = append(chunk, buf[:n]...) } return string(chunk) //fmt.println(string(chunk))}
读文件方式三:先从文件读取到file, 在从file读取到reader中,从reader读取到buf, buf最终追加到[]byte
//先从文件读取到file, 在从file读取到reader中,从reader读取到buf, buf最终追加到[]byte,这个排第三func read2() (string) { fi, err := os.open("file/test") if err != nil { panic(err) } defer fi.close() r := bufio.newreader(fi) var chunks []byte buf := make([]byte, 1024) for { n, err := r.read(buf) if err != nil && err != io.eof { panic(err) } if 0 == n { break } //fmt.println(string(buf)) chunks = append(chunks, buf...) } return string(chunks) //fmt.println(string(chunks))}
读文件方式四:读取到file中,再利用ioutil将file直接读取到[]byte中
//读取到file中,再利用ioutil将file直接读取到[]byte中, 这是最优func read3() (string){ f, err := os.open("file/test") if err != nil { fmt.println("read file fail", err) return "" } defer f.close() fd, err := ioutil.readall(f) if err != nil { fmt.println("read to fd fail", err) return "" } return string(fd)}
读取速度比较
经过我的测试,这四种方式读的速度排名是:前者为优
方式四 > 方式一 > 方式三 > 方式四
写文件
写文件方式一:使用 io.writestring 写入文件
func write0() { filename := "file/test1" strtest := "测试测试" var f *os.file var err error if checkfileexist(filename) { //文件存在 f, err = os.openfile(filename, os.o_append, 0666) //打开文件 if err != nil{ fmt.println("file open fail", err) return } }else { //文件不存在 f, err = os.create(filename) //创建文件 if err != nil { fmt.println("file create fail") return } } //将文件写进去 n, err1 := io.writestring(f, strtest) if err1 != nil { fmt.println("write error", err1) return } fmt.println("写入的字节数是:", n)}
写文件方式二:使用 ioutil.writefile 写入文件
func write1() { filename := "file/test2" strtest := "测试测试" var d = []byte(strtest) err := ioutil.writefile(filename, d, 0666) if err != nil { fmt.println("write fail") } fmt.println("write success")}
写文件方式三:使用 file(write,writestring) 写入文件
func write2() { filename := "file/test3" strtest := "测试测试" var d1 = []byte(strtest) f, err3 := os.create(filename) //创建文件 if err3 != nil{ fmt.println("create file fail") } defer f.close() n2, err3 := f.write(d1) //写入文件(字节数组) fmt.printf("写入 %d 个字节n", n2) n3, err3 := f.writestring("writesn") //写入文件(字节数组) fmt.printf("写入 %d 个字节n", n3) f.sync()}
写文件方式四:使用 bufio.newwriter 写入文件
func write3() { filename := "file/test3" f, err3 := os.create(filename) //创建文件 if err3 != nil{ fmt.println("create file fail") } w := bufio.newwriter(f) //创建新的 writer 对象 n4, err3 := w.writestring("bufferedn") fmt.printf("写入 %d 个字节n", n4) w.flush() f.close()}
检查文件是否存在:
func checkfileexist(filename string) bool { _, err := os.stat(filename) if os.isnotexist(err) { return false } return true}
更多golang知识请关注golang教程栏目。
以上就是golang如何读取文件的详细内容。