golang读取文件的常用方法总结
使用go语言读取文件的各种方式整理。
一次性加载到内存中
//*整个文件读到内存,适用于文件较小的情况
//每次读取固定字节
//问题容易出现乱码,因为中文和中文符号不占一个字符
funcreadAllIntoMemory(filenamestring)(content[]byte,errerror){
fp,err:=os.Open(filename)//获取文件指针
iferr!=nil{
returnnil,err
}
deferfp.Close()
fileInfo,err:=fp.Stat()
iferr!=nil{
returnnil,err
}
buffer:=make([]byte,fileInfo.Size())
_,err=fp.Read(buffer)//文件内容读取到buffer中
iferr!=nil{
returnnil,err
}
returnbuffer,nil
}
一次性加载到内存中适用于小文件。如果文件太大,内存紧张的情况下,可以借助缓冲,分多次读取。
分块读取
//*一块一块地读取,即给一个缓冲,分多次读到缓冲中
//按字节读取,将整个文件读取到缓冲区buffer
funcreadByBlock(filenamestring)(content[]byte,errerror){
fp,err:=os.Open(filename)//获取文件指针
iferr!=nil{
returnnil,err
}
deferfp.Close()
constbufferSize=64//缓冲大小,每次读取64个字节
buffer:=make([]byte,bufferSize)
for{
//注意这里要取bytesRead,否则有问题
bytesRead,err:=fp.Read(buffer)//文件内容读取到buffer中
content=append(content,buffer[:bytesRead]...)
iferr!=nil{
iferr==io.EOF{
err=nil
break
}else{
returnnil,err
}
}
}
return
}
有时我们也需要按行处理
按行读
//逐行读取,一行是一个[]byte,多行就是[][]byte
funcreadByLine(filenamestring)(lines[][]byte,errerror){
fp,err:=os.Open(filename)//获取文件指针
iferr!=nil{
returnnil,err
}
deferfp.Close()
bufReader:=bufio.NewReader(fp)
for{
line,_,err:=bufReader.ReadLine()//按行读
iferr!=nil{
iferr==io.EOF{
err=nil
break
}
}else{
lines=append(lines,line)
}
}
return
}
使用ioutil读取文件的所有内容
functest1(){
bytes,err:=ioutil.ReadFile("filetoread.txt")
iferr!=nil{
log.Fatal(err)
}
fmt.Println("totalbytesread:",len(bytes))
fmt.Println("stringread:",string(bytes))
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接