我有很多小文件,我不想逐行阅读。
Go中是否有一个函数将整个文件读入字符串变量?
答案 0 :(得分:197)
func ReadFile(filename string) ([]byte, error)
ReadFile读取由filename命名的文件并返回内容。一个成功的电话 返回err == nil,而不是err == EOF。因为ReadFile读取整个文件,所以它不会处理 来自Read的EOF作为要报告的错误。
您将获得[]byte
而不是string
。如果确实必要,可以转换它:
s := string(buf)
答案 1 :(得分:35)
如果您只想将内容设为string
,那么简单的解决方案就是使用ReadFile
包中的io/ioutil
函数。此函数返回bytes
的切片,您可以轻松将其转换为string
。
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'
}
答案 2 :(得分:17)
我认为最好的办法是,如果你真的关心连接所有这些文件的效率,那就是将它们全部复制到相同的字节缓冲区中。
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()具有您正在寻找的数据。
答案 3 :(得分:2)
我就这样做了:
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)
}
答案 4 :(得分:2)
您可以使用strings.Builder
:
package main
import (
"io"
"os"
"strings"
)
func main() {
f, e := os.Open("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
b := new(strings.Builder)
io.Copy(b, f)
print(b.String())
}
或者如果您不介意[]byte
,您可以使用:
package main
import "os"
func main() {
b, e := os.ReadFile("file.txt")
if e != nil {
panic(e)
}
os.Stdout.Write(b)
}
答案 5 :(得分:0)
我不在电脑上,所以我写了草稿。您可能不明白我在说什么。
public int roll(){
return ThreadLocalRandom.current().nextInt(0, 6);
}