欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

golang读取文件的常用方法总结

程序员文章站 2023-10-31 09:47:34
使用go语言读取文件的各种方式整理。 一次性加载到内存中 // * 整个文件读到内存,适用于文件较小的情况 //每次读取固定字节 //问题容易出现乱码,因为...

使用go语言读取文件的各种方式整理。

一次性加载到内存中

// * 整个文件读到内存,适用于文件较小的情况
//每次读取固定字节
//问题容易出现乱码,因为中文和中文符号不占一个字符
func readallintomemory(filename string) (content []byte, err error) {
 fp, err := os.open(filename) // 获取文件指针
 if err != nil {
 return nil, err
 }
 defer fp.close()
 fileinfo, err := fp.stat()
 if err != nil {
 return nil, err
 }
 buffer := make([]byte, fileinfo.size())
 _, err = fp.read(buffer) // 文件内容读取到buffer中
 if err != nil {
 return nil, err
 }
 return buffer, nil
}

一次性加载到内存中适用于小文件。 如果文件太大, 内存紧张的情况下, 可以借助缓冲, 分多次读取。

分块读取

// * 一块一块地读取, 即给一个缓冲, 分多次读到缓冲中
//按字节读取,将整个文件读取到缓冲区buffer
func readbyblock(filename string) (content []byte, err error) {
 fp, err := os.open(filename) // 获取文件指针
 if err != nil {
 return nil, err
 }
 defer fp.close()
 const buffersize = 64 // 缓冲大小, 每次读取64个字节
 buffer := make([]byte, buffersize)
 for {
 // 注意这里要取bytesread, 否则有问题
 bytesread, err := fp.read(buffer) // 文件内容读取到buffer中
 content = append(content, buffer[:bytesread]...)
 if err != nil {
  if err == io.eof {
  err = nil
  break
  } else {
  return nil, err
  }
 }
 }
 return
}

有时我们也需要按行处理

按行读

// 逐行读取, 一行是一个[]byte, 多行就是[][]byte
func readbyline(filename string) (lines [][]byte, err error) {
 fp, err := os.open(filename) // 获取文件指针
 if err != nil {
 return nil, err
 }
 defer fp.close()
 bufreader := bufio.newreader(fp)
 for {
 line, _, err := bufreader.readline() // 按行读
 if err != nil {
  if err == io.eof {
  err = nil
  break
  }
 } else {
  lines = append(lines, line)
 }
 }
 return
}

使用ioutil读取文件的所有内容

func test1() {
 bytes,err := ioutil.readfile("filetoread.txt")
 if err != nil {
 log.fatal(err)
 }
 fmt.println("total bytes read:",len(bytes))
 fmt.println("string read:",string(bytes))
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接