直接回答:小文件直接用 os.ReadFile 一把读进来,大文件用 bufio.Scanner 逐行处理,要拷贝文件用 io.Copy,只读一部分就自己开 File 加 Read;取文件名用 filepath.Base,去后缀用 strings.TrimSuffix。
读取文件的四种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| package main
import ( "bufio" "fmt" "io" "io/ioutil" "os" "time" )
func read0(path string) string { f, err := ioutil.ReadFile(path) if err != nil { fmt.Printf("%s\n", err) panic(err) } return string(f) }
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, 512) for { n, err := fi.Read(buf) if err != nil && err != io.EOF { panic(err) } if 0 == n { break } chunks = append(chunks, 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) for { n, err := r.Read(buf) if err != nil && err != io.EOF { panic(err) } if 0 == n { break } chunks = append(chunks, 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) return string(fd) }
func main() {
file := "../test.go" start := time.Now()
read0(file) t0 := time.Now() fmt.Printf("Cost time %v\n", t0.Sub(start))
read1(file) t1 := time.Now() fmt.Printf("Cost time %v\n", t1.Sub(t0))
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))
}
|
取文件名与去掉后缀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package main
import ( "fmt" "path" "strings" )
func main() { fullFilename := "test.txt" var filenameWithSuffix string filenameWithSuffix = path.Base(fullFilename) var fileSuffix string fileSuffix = path.Ext(filenameWithSuffix)
var filenameOnly string filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix) fmt.Println("filenameOnly =", filenameOnly) }
|
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。