go对大文件操作

package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strings"
)

func main() {
     
	//fileClose()
	//fileRead()
	//fileReadClose()
	//fileBufio()
	//fileIoutil()
	//fileWrite()
	fileCopy()
}

func fileClose() {
     
	//os.Open是只读模式
	fileObj, err := os.Open("D:\\360驱动大师目录\\新建文本文档.txt")
	if err != nil {
     
		panic(err)
	}
	//关闭文件
	fileObj.Close()
	//一般情况下使用这种方式关闭文件
	defer fileObj.Close()
}

func fileRead() {
     
	//os.Open是只读模式
	fileObj, err := os.Open("D:\\360驱动大师目录\\新建文本文档.txt")
	if err != nil {
     
		panic(err)
	}
	var fileBytes = make([]byte, 128)
	n, err := fileObj.Read(fileBytes)
	if err != nil {
     
		panic(err)
	}
	fmt.Println(string(fileBytes[:n]))
	//一般情况下使用这种方式关闭文件
	defer fileObj.Close()
}

// 虽然可以用中文代替变量  但是不推荐使用
func fileReadClose() {
     
	//os.Open是只读模式
	fileObj, err := os.Open("D:\\360驱动大师目录\\新建文本文档.txt")
	if err != nil {
     
		panic(err)
	}
	//一般情况下使用这种方式关闭文件
	defer fileObj.Close()
	var 罐子 []string
	var 每次读取字节 = make([]byte, 128)
	for {
     
		n, err := fileObj.Read(每次读取字节)
		//err == io.EOF表示读完了,一定要放在err != nil前面
		if err == io.EOF {
     
			break
		}
		if err != nil {
     
			panic(err)
		}
		var 每次读取字符串 = string(每次读取字节[:n])
		罐子 = append(罐子, 每次读取字符串)
	}
	fmt.Println(罐子)
}

func fileBufio() {
     
	//os.Open是只读模式
	fileObj, err := os.Open("D:\\360驱动大师目录\\新建文本文档.txt")
	if err != nil {
     
		panic(err)
	}
	//一般情况下使用这种方式关闭文件
	defer fileObj.Close()
	//需要将文件对象传进去
	reader := bufio.NewReader(fileObj)
	for {
     
		//按行读取
		row, err := reader.ReadString('\n') //参数是字符,不是字符串
		if err == io.EOF {
     
			break
		}
		if err != nil {
     
			panic(err)
		}
		fmt.Printf("%v", row)
	}
}

func fileIoutil() {
     
	//os.Open是只读模式
	bytes, err := ioutil.ReadFile("D:\\360驱动大师目录\\新建文本文档.txt")
	if err != nil {
     
		panic(err)
	}
	fmt.Println(string(bytes))
}

// 写入2次内容 会把原来的内容覆盖掉
// os.O_WRONLY     只写
// os.O_RDONLY     只读
// os.O_CREATE     如果文件不存在,则创建文件
// os.O_RDWR         可读可写
// os.O_TRUNC       清空
// os.O_APPEND     追加文件
func fileWrite() {
     
	fileObj, err := os.OpenFile("D:\\360驱动大师目录\\新建文本文档.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
     
		panic(err)
	}
	defer fileObj.Close()
	content := "内容\n"
	//Write方法需要将字符串转成字节
	fileObj.Write([]byte(content))
	//WriteString直接写入字符串
	fileObj.WriteString(content)
}

func fileWriteBufio() {
     
	fileObj, err := os.OpenFile("D:\\360驱动大师目录\\新建文本文档.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)
	if err != nil {
     
		panic(err)
	}
	defer fileObj.Close()
	var content = "内容\n"
	writer := bufio.NewWriter(fileObj)
	writer.Write([]byte(content))
	writer.WriteString(content)
	//写完必须刷入
	writer.Flush()
}

func fileWriteIoutil() {
     
	var content = "内容\n"
	err := ioutil.WriteFile("D:\\360驱动大师目录\\新建文本文档.txt", []byte(content), 0666)
	if err != nil {
     
		panic(err)
	}
}

func fileCopy() {
     
	原文件, err := os.Open("D:\\360驱动大师目录\\旧建文本文档.txt")
	if err != nil {
     
		panic(err)
	}
	defer 原文件.Close()
	目标文件, err := os.OpenFile("D:\\360驱动大师目录\\新建文本文档.txt", os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
     
		panic(err)
	}
	defer 目标文件.Close()
	//拷贝文件
	io.Copy(目标文件, 原文件)
}

func ReadFile(filePath string, handle func(string)) error {
     
	f, err := os.Open(filePath)
	defer f.Close()
	if err != nil {
     
		return err
	}
	buf := bufio.NewReader(f)
	for {
     
		line, err := buf.ReadString('\n')
		line = strings.TrimSpace(line)
		handle(line)
		if err != nil {
     
			if err == io.EOF {
     
				return nil
			}
			return err
		}
		return nil
	}
}

func ReadBigFile(fileName string, handle func([]byte)) error {
     
	f, err := os.Open(fileName)
	if err != nil {
     
		fmt.Println("can't opened this file")
		return err
	}
	defer f.Close()
	s := make([]byte, 4096)
	for {
     
		switch nr, err := f.Read(s[:]); true {
     
		case nr < 0:
			fmt.Fprintf(os.Stderr, "cat: error reading: %s\n", err.Error())
			os.Exit(1)
		case nr == 0: // EOF
			return nil
		case nr > 0:
			handle(s[0:nr])
		}
	}
	return nil
}

参考:https://mp.weixin.qq.com/s/eJvpKdn1oX4-HtroZsOEZQ

你可能感兴趣的:(GO开发,go对大文件操作,golang对大文件操作,go对超大文件操作,go对文件TB文件操作,go)