如何将整个文件读入字符串变量

我有很多小文件,我不想一行一行地看。

在Go中是否有一个函数可以将整个文件读入字符串变量?

209384 次浏览

使用ioutil.ReadFile:

func ReadFile(filename string) ([]byte, error)

ReadFile读取以filename命名的文件并返回内容。通话成功 返回err == nil,而不是err == EOF。因为ReadFile读取整个文件,所以它不进行处理

. Read中的EOF作为要报告的错误

你将得到一个[]byte而不是string。如果真的是必要的,它可以被转换:

s := string(buf)

我认为最好的办法,如果你真的关心连接所有这些文件的效率,就是把它们都复制到同一个字节缓冲区。

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
f, _ := os.Open(filename) // Error handling elided for brevity.
io.Copy(buf, f)           // Error handling elided for brevity.
f.Close()
}
s := string(buf.Bytes())

这将打开每个文件,将其内容复制到buf中,然后关闭该文件。根据您的情况,您可能实际上不需要转换它,最后一行只是显示buf.Bytes()有您正在寻找的数据。

如果你只想要内容为string,那么简单的解决方案是使用io/ioutil包中的ReadFile函数。此函数返回bytes的一个切片,您可以轻松地将其转换为string

使用1.16或更高版本

在本例中,将ioutil替换为os

package main


import (
"fmt"
"os"
)


func main() {
b, err := os.ReadFile("file.txt") // just pass the file name
if err != nil {
fmt.Print(err)
}


fmt.Println(b) // print the content as 'bytes'


str := string(b) // convert content to a 'string'


fmt.Println(str) // print the content as a 'string'
}

使用1.15或更早版本

package main


import (
"fmt"
"io/ioutil"
)


func main() {
b, err := ioutil.ReadFile("file.txt") // just pass the file name
if err != nil {
fmt.Print(err)
}


fmt.Println(b) // print the content as 'bytes'


str := string(b) // convert content to a 'string'


fmt.Println(str) // print the content as a 'string'
}

我是这样做的:

package main


import (
"fmt"
"os"
"bytes"
"log"
)


func main() {
filerc, err := os.Open("filename")
if err != nil{
log.Fatal(err)
}
defer filerc.Close()


buf := new(bytes.Buffer)
buf.ReadFrom(filerc)
contents := buf.String()


fmt.Print(contents)


}

我不会电脑,所以我写一份草稿。你应该明白我在说什么。

func main(){
const dir = "/etc/"
filesInfo, e := ioutil.ReadDir(dir)
var fileNames = make([]string, 0, 10)
for i,v:=range filesInfo{
if !v.IsDir() {
fileNames = append(fileNames, v.Name())
}
}


var fileNumber = len(fileNames)
var contents = make([]string, fileNumber, 10)
wg := sync.WaitGroup{}
wg.Add(fileNumber)


for i,_:=range content {
go func(i int){
defer wg.Done()
buf,e := ioutil.Readfile(fmt.Printf("%s/%s", dir, fileName[i]))
defer file.Close()
content[i] = string(buf)
}(i)
}
wg.Wait()
}

你可以使用字符串。构建器:

package main


import (
"io"
"os"
"strings"
)


func main() {
f, err := os.Open("file.txt")
if err != nil {
panic(err)
}
defer f.Close()
b := new(strings.Builder)
io.Copy(b, f)
print(b.String())
}

或者如果你不介意[]byte,你可以使用 操作系统。ReadFile: < / p >

package main
import "os"


func main() {
b, err := os.ReadFile("file.txt")
if err != nil {
panic(err)
}
os.Stdout.Write(b)
}

对于使用1.16或更高版本,你可以在编译时读取文件。

使用//go:embed指令和走1.16中的嵌入

例如:

package main


import (
"fmt"
_ "embed"
)


//go:embed file.txt
var s string


func main() {
fmt.Println(s) // print the content as a 'string'
}