ackage main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file1, err1 := os.Open("xxxxxx.mp4")            // 只读方式打开文件
	if err1 != nil {                                // 文件打开错误
		fmt.Println("打开原文件错误!")
	}

	// os.O_WRONLY,写模式;os.O_CREATE,文件不存在时创建;0666为权限。
	file2, err2 := os.OpenFile("yyyy.mp4", os.O_WRONLY|os.O_CREATE, 0666)
	if err2 != nil { // 文件打开错误
		fmt.Println("打开目标文件错误!")
	}
	defer func() { // 延迟关闭文件
		file1.Close()
		file2.Close()
	}()

	read := bufio.NewReader(file1)       // 创建读取器
	write := bufio.NewWriter(file2)      // 创建写

	// 创建读取缓存。
	// 数值越大,一次读取的数据量越大,占用内存越大,读取次数减少,读取越快。
	// 数值越小,一次读取的数据量越小,占用内存越小,读取次数增加,读取越慢。
	buf := make([]byte, 1024)

	for {                               // 循环读取数据
		n, err3 := read.Read(buf)       // 读取数据到缓存,n为读取到的数据长度
		if err3 != nil {                // 读取错误
			if err3 == io.EOF {         // 读取完毕
				write.Flush()           // 保存最后一次读取的数据
				fmt.Println("文件复制完毕!")
			} else {
				fmt.Println("文件读取错误!")
			}
			break                         // 结束读取循环
		}
		_, err4 := write.Write(buf[:n])   // 循环写入文件
		if err4 != nil {
			fmt.Println("写文件错误!")
		}
	}
}