String 如何将整个文件读入字符串变量
我有很多小文件,我不想一行一行地读 Go中是否有将整个文件读入字符串变量的函数?使用: ReadFile读取按文件名命名的文件并返回内容。成功的电话 返回err==nil,而不是err==EOF。因为ReadFile读取整个文件,所以它不处理 从读取的EOF作为要报告的错误 您将得到一个String 如何将整个文件读入字符串变量,string,file,go,String,File,Go,我有很多小文件,我不想一行一行地读 Go中是否有将整个文件读入字符串变量的函数?使用: ReadFile读取按文件名命名的文件并返回内容。成功的电话 返回err==nil,而不是err==EOF。因为ReadFile读取整个文件,所以它不处理 从读取的EOF作为要报告的错误 您将得到一个[]字节,而不是字符串。如果确实需要,可以对其进行转换: s := string(buf) 如果你真的关心连接所有这些文件的效率,我认为最好的办法是将它们都复制到相同的字节缓冲区中 buf := bytes.N
[]字节,而不是字符串
。如果确实需要,可以对其进行转换:
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
函数。此函数返回一段字节
,您可以轻松地将其转换为字符串
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([]字符串,0,10)
对于i,v:=范围filesInfo{
如果!v.IsDir(){
fileNames=append(文件名,v.Name())
}
}
var fileNumber=len(文件名)
var contents=make([]字符串,文件号,10)
wg:=sync.WaitGroup{}
wg.Add(文件号)
对于i,z:=范围内容{
go func(i int){
推迟工作组完成()
buf,e:=ioutil.Readfile(fmt.Printf(“%s/%s”,dir,文件名[i]))
延迟文件。关闭()
内容[i]=字符串(buf)
}(一)
}
wg.Wait()
}
您可以使用字符串.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())
}
或者,如果您不介意[]字节
,您可以使用:
package main
import "os"
func main() {
b, e := os.ReadFile("file.txt")
if e != nil {
panic(e)
}
os.Stdout.Write(b)
}
然后,为了构造最终字符串结果,可以在读取每个文件时使用append()将数据累积到单个字节片中,然后将累积的字节片转换为最终字符串结果。或者,您可能需要bytes.Join.Show我们如何转换它然后。。。这个问题不需要字节数组,用它打开一个html文件,我发现每一行后面都会追加一行,这会弄乱我的格式。有什么办法可以避免吗?golang是强类型的。如果您需要类型字符串而不是[]字节,那么转换是非常必要的。很高兴字符串(字节)完成了任务。嗨,io.Copy会覆盖buf的内容吗?buf的容量是多少?谢谢。复制不会覆盖,它只会不断添加到buf中,buf将根据需要增长以容纳新数据。buf具有“无限”容量。随着更多数据的添加,它将继续扩展。ioutil.Readfile将分配一个足够大的缓冲区来容纳完整的文件,而不需要重新分配。与简单地将bytebuffer附加到切片(/array)相比,使用bytebuffer真的能提高性能吗?记忆呢?区别有多大?虽然ioutil.ReadFile更简洁,因此在文件尚未打开时更可取,但是buf.ReadFrom()在您已经获得打开文件的情况下工作,因此这是一个很好的第二个答案。
package main
import "os"
func main() {
b, e := os.ReadFile("file.txt")
if e != nil {
panic(e)
}
os.Stdout.Write(b)
}