golang 逐行读取文件读文件为什么这么慢

Golang 逐行读取文件
| Go语言中文网 | Golang中文社区 | Golang中国
<meta name="author" content="polaris ">
Golang 逐行读取文件
Golang 逐行读取文件
golang的错误处理有点奇怪.
插入代码时候, 使用插入代码(推荐) 出现错误: 无法解析服务器的 DNS 地址。
使用插入代码, 直接是文本插入, 连着色都没有.
插入图片要地址, 不能上传.
下载客户端, 转到微软的网站时已经是: We can’t find that page.
写个博客都这么难比较失望.
package jutil
&#34;bufio&#34;
&#34;io&#34;
&#34;os&#34;
&#34;strings&#34;
func ReadLine(fileName string, handler func(string)) error {
f, err := os.Open(fileName)
if err != nil {
return err
buf := bufio.NewReader(f)
line, err := buf.ReadString(&#39;\n&#39;)
line = strings.TrimSpace(line)
handler(line)
if err != nil {
if err == io.EOF {
return nil
return err
return nil
支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
支持 @ 本站用户;支持表情(输入 : 提示),见
golang的错误处理有点奇怪.
插入代码时候, 使用插入代码(推荐) 出现错误: 无法解析服务器的 DNS 地址。
使用插入代码, 直接是文本插入, 连着色都没有.
插入图片要地址, 不能上传.
下载客户端, 转到微软的网站时已经是: We can’t find that page.
写个博客都这么难比较失望.
package jutil
&#34;bufio&#34;
&#34;io&#34;
&#34;os&#34;
&#34;strings&#34;
func ReadLine(fileName string, handler func(string)) error {
f, err := os.Open(fileName)
if err != nil {
return err
buf := bufio.NewReader(f)
line, err := buf.ReadString(&#39;\n&#39;)
line = strings.TrimSpace(line)
handler(line)
if err != nil {
if err == io.EOF {
return nil
return err
return nil
记住登录状态
还不是会员& GoLang提供了很多读文件的方式,一般来说常用的有三种。使用Read加上buffer,使用bufio库和ioutil 库。
那他们的效率如何呢?用一个简单的程序来评测一下:
package main
"io/ioutil"
func read1(path string)string{
fi,err := os.Open(path)
if err != nil{
panic(err)
defer fi.Close()
chunks := make([]byte,1024,1024)
buf := make([]byte,1024)
n,err := fi.Read(buf)
if err != nil && err != io.EOF{panic(err)}
if 0 ==n {break}
chunks=append(chunks,buf[:n]...)
// fmt.Println(string(buf[:n]))
return string(chunks)
func read2(path string)string{
fi,err := os.Open(path)
if err != nil{panic(err)}
defer fi.Close()
r := bufio.NewReader(fi)
chunks := make([]byte,1024,1024)
buf := make([]byte,1024)
n,err := r.Read(buf)
if err != nil && err != io.EOF{panic(err)}
if 0 ==n {break}
chunks=append(chunks,buf[:n]...)
// fmt.Println(string(buf[:n]))
return string(chunks)
func read3(path string)string{
fi,err := os.Open(path)
if err != nil{panic(err)}
defer fi.Close()
fd,err := ioutil.ReadAll(fi)
// fmt.Println(string(fd))
return string(fd)
func main(){
flag.Parse()
file := flag.Arg(0)
f,err := ioutil.ReadFile(file)
if err != nil{
fmt.Printf("%s\n",err)
panic(err)
fmt.Println(string(f))
start := time.Now()
read1(file)
t1 := time.Now()
fmt.Printf("Cost time %v\n",t1.Sub(start))
read2(file)
t2 := time.Now()
fmt.Printf("Cost time %v\n",t2.Sub(t1))
read3(file)
t3 := time.Now()
fmt.Printf("Cost time %v\n",t3.Sub(t2))
& &运行命令go run read.go filename, 制定需要读取的文件就可以了。这里我比较了读取13.7MB的日志文件,三种方式分别消耗的时间是:
Cost&time&105.006ms&&
Cost&time&68.0039ms&&
Cost&time&31.0018ms&&
& &读取29.3MB的媒体文件:
Cost&time&390.0223ms&&
Cost&time&194.0111ms&&
Cost&time&83.0048ms&&
& & 读取302MB的媒体文件
Cost&time&40.8043338s&&
Cost&time&1m5.0407201s&&
Cost&time&8.8155043s&&
& &这个差距就很明显了,ioutil提供的方法效率就是高。有空可以再从代码层面再去分析一下。
Views(...) Comments()爱热闹的独行者
阅读(2932)
package&main
&&&&&bufio&
&&&&&os/exec&
&&&&&path/filepath&
&&&&&strings&
&&&&&time&
/*获取当前文件执行的路径*/
func&GetCurrPath()&string&{
&&&&file,&_&:=&exec.LookPath(os.Args[0])
&&&&path,&_&:=&filepath.Abs(file)
&&&&splitstring&:=&strings.Split(path,&&\\&)
&&&&size&:=&len(splitstring)
&&&&splitstring&=&strings.Split(path,&splitstring[size-1])
&&&&ret&:=&strings.Replace(splitstring[0],&&\\&,&&/&,&size-1)
&&&&return&ret
func&main()&{
&&&&//创建日志文件
&&&&t&:=&time.Now()
&&&&filepath&:=&&./log_&&+&strings.Replace(t.String()[:19],&&:&,&&_&,&3)&+&&.txt&
&&&&file,&err&:=&os.OpenFile(filepath,&os.O_CREATE,&0666)
&&&&if&err&!=&nil&{
&&&&&&&&log.Fatal(&create&log&file&failed!&)
&&&&defer&file.Close()
&&&&wFile&:=&bufio.NewWriter(file)
&&&&//获取当前程序执行的绝对路径
&&&&wFile.WriteString(GetCurrPath())&
&&&&wFile.Flush()
阅读排行榜golang 读写文件 - 豆蔻 - 让分享自由自在!
怎么能吧这个忘了,golang读写文件最近本的,哈哈
package main
func main() {
f, err := os.OpenFile("file2.txt", os.O_RDWR | os.O_CREATE | os.O_APPEND, 0x644)
if err != nil {
panic(err)
defer f.Close()
wint, err := f.WriteString("helloworld")
if err != nil {
panic(err)
fmt.Printf("%d\n", wint)
_, err = f.Seek(0, 0)
if err != nil {
panic(err)
bs := make([]byte, 100)
rint, err := f.Read(bs)
if err != nil {
panic(err)
fmt.Printf("%d, %s\n", rint, bs)

我要回帖

更多关于 golang 读取json文件 的文章

 

随机推荐