在go中逐字节处理文件
Processing a file byte by byte in go
类似于this question,在go中一次一个字节处理一个文件的惯用方式是什么?
换句话说,有没有更好的写法?
file, err := ioutil.ReadFile(filename)
file_string = string(file)
for i, c := range file_string {
// -snip-
}
您一次将整个文件作为字符串(而不是字节)读取,然后逐个符文(而不是逐个字节)对其进行处理。要逐字逐句地一次读取一个字节(这 很可能不是您想要的),您必须完全这样做:
f, err := os.Open("path")
if err != nil {
panic(err)
}
b := make([]byte, 1)
for err := f.Read(b) {
if err != nil && !errors.Is(err, io.EOF) {
fmt.Println(err)
break
}
// process the one byte b[0]
if err != nil {
// end of file
break
}
}
但是,您更可能想要的是高效地读取文件,并且一次处理一个字节。为此你应该使用 buffered reader:
f, err := os.Open("path")
if err != nil {
panic(err)
}
br := bufio.NewReader(f)
for b,err := br.ReadByte() {
if err != nil && !errors.Is(err, io.EOF) {
fmt.Println(err)
break
}
// process the one byte b
if err != nil {
// end of file
break
}
}
类似于this question,在go中一次一个字节处理一个文件的惯用方式是什么?
换句话说,有没有更好的写法?
file, err := ioutil.ReadFile(filename)
file_string = string(file)
for i, c := range file_string {
// -snip-
}
您一次将整个文件作为字符串(而不是字节)读取,然后逐个符文(而不是逐个字节)对其进行处理。要逐字逐句地一次读取一个字节(这 很可能不是您想要的),您必须完全这样做:
f, err := os.Open("path")
if err != nil {
panic(err)
}
b := make([]byte, 1)
for err := f.Read(b) {
if err != nil && !errors.Is(err, io.EOF) {
fmt.Println(err)
break
}
// process the one byte b[0]
if err != nil {
// end of file
break
}
}
但是,您更可能想要的是高效地读取文件,并且一次处理一个字节。为此你应该使用 buffered reader:
f, err := os.Open("path")
if err != nil {
panic(err)
}
br := bufio.NewReader(f)
for b,err := br.ReadByte() {
if err != nil && !errors.Is(err, io.EOF) {
fmt.Println(err)
break
}
// process the one byte b
if err != nil {
// end of file
break
}
}