1 回答
TA贡献1784条经验 获得超8个赞
这取决于您要尝试做什么。
file, err := os.Open("file.txt")
fmt.print(file)
它输出 &{0xc082016240} 的原因是因为您正在打印文件描述符 ( *os.File)的指针值,而不是文件内容。要获取文件内容,您可以READ从文件描述符中获取。
要将所有文件内容(以字节为单位)读取到内存中, ioutil.ReadAll
package main
import (
"fmt"
"io/ioutil"
"os"
"log"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
b, err := ioutil.ReadAll(file)
fmt.Print(b)
}
但有时,如果文件很大,只读取块可能更节省内存:缓冲区大小,因此您可以使用io.Reader.Readfrom的实现*os.File
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
buf := make([]byte, 32*1024) // define your buffer size here.
for {
n, err := file.Read(buf)
if n > 0 {
fmt.Print(buf[:n]) // your read buffer.
}
if err == io.EOF {
break
}
if err != nil {
log.Printf("read %d bytes: %v", n, err)
break
}
}
}
否则,您也可以使用标准的 util 包:bufio, try Scanner。AScanner在标记中读取您的文件:分隔符。
默认情况下,扫描仪通过换行符推进标记(当然,您可以自定义扫描仪如何标记您的文件,从这里学习bufio 测试)。
package main
import (
"fmt"
"os"
"log"
"bufio"
)
func main() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = file.Close(); err != nil {
log.Fatal(err)
}
}()
scanner := bufio.NewScanner(file)
for scanner.Scan() { // internally, it advances token based on sperator
fmt.Println(scanner.Text()) // token in unicode-char
fmt.Println(scanner.Bytes()) // token in bytes
}
}
最后,我还想向您推荐这个很棒的网站:go-lang filecheatsheet。它几乎涵盖了与在 go-lang 中处理文件相关的所有内容,希望您会发现它很有用。
- 1 回答
- 0 关注
- 169 浏览
添加回答
举报