直接回答:小文件直接用 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"
//fmt.Println("fullFilename =", fullFilename)
var filenameWithSuffix string
filenameWithSuffix = path.Base(fullFilename)
//fmt.Println("filenameWithSuffix =", filenameWithSuffix)
var fileSuffix string
// 获取后缀,下面的会输出 ".txt"
fileSuffix = path.Ext(filenameWithSuffix)
//fmt.Println("fileSuffix =", fileSuffix)

var filenameOnly string
// 通过使用trim,去除.txt从而得到文件面
filenameOnly = strings.TrimSuffix(filenameWithSuffix, fileSuffix)
fmt.Println("filenameOnly =", filenameOnly)
}


这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!