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

[复制链接]
查看1785 | 回复0 | 2019-6-11 10:34:17 | 显示全部楼层 |阅读模式
使用go语言读取文件的各种方式整理。
一次性加载到内存中
  1. // * 整个文件读到内存,适用于文件较小的情况
  2. //每次读取固定字节
  3. //问题容易出现乱码,因为中文和中文符号不占一个字符
  4. func readAllIntoMemory(filename string) (content []byte, err error) {
  5. fp, err := os.Open(filename) // 获取文件指针
  6. if err != nil {
  7. return nil, err
  8. }
  9. defer fp.Close()
  10. fileInfo, err := fp.Stat()
  11. if err != nil {
  12. return nil, err
  13. }
  14. buffer := make([]byte, fileInfo.Size())
  15. _, err = fp.Read(buffer) // 文件内容读取到buffer中
  16. if err != nil {
  17. return nil, err
  18. }
  19. return buffer, nil
  20. }
复制代码
一次性加载到内存中适用于小文件。 如果文件太大, 内存紧张的情况下, 可以借助缓冲, 分多次读取。
分块读取
  1. // * 一块一块地读取, 即给一个缓冲, 分多次读到缓冲中
  2. //按字节读取,将整个文件读取到缓冲区buffer
  3. func readByBlock(filename string) (content []byte, err error) {
  4. fp, err := os.Open(filename) // 获取文件指针
  5. if err != nil {
  6. return nil, err
  7. }
  8. defer fp.Close()
  9. const bufferSize = 64 // 缓冲大小, 每次读取64个字节
  10. buffer := make([]byte, bufferSize)
  11. for {
  12. // 注意这里要取bytesRead, 否则有问题
  13. bytesRead, err := fp.Read(buffer) // 文件内容读取到buffer中
  14. content = append(content, buffer[:bytesRead]...)
  15. if err != nil {
  16.   if err == io.EOF {
  17.   err = nil
  18.   break
  19.   } else {
  20.   return nil, err
  21.   }
  22. }
  23. }
  24. return
  25. }
复制代码
有时我们也需要按行处理
按行读
  1. // 逐行读取, 一行是一个[]byte, 多行就是[][]byte
  2. func readByLine(filename string) (lines [][]byte, err error) {
  3. fp, err := os.Open(filename) // 获取文件指针
  4. if err != nil {
  5. return nil, err
  6. }
  7. defer fp.Close()
  8. bufReader := bufio.NewReader(fp)
  9. for {
  10. line, _, err := bufReader.ReadLine() // 按行读
  11. if err != nil {
  12.   if err == io.EOF {
  13.   err = nil
  14.   break
  15.   }
  16. } else {
  17.   lines = append(lines, line)
  18. }
  19. }
  20. return
  21. }
复制代码
使用ioutil读取文件的所有内容
  1. func test1() {
  2. bytes,err := ioutil.ReadFile("filetoread.txt")
  3. if err != nil {
  4. log.Fatal(err)
  5. }
  6. fmt.Println("total bytes read:",len(bytes))
  7. fmt.Println("string read:",string(bytes))
  8. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则