我希望以非缓冲的方式扩展将数据写入文件的现有代码。
代码要求编写器实现io.WriteCloser
接口。因此,仅用bufio.Writer
包装现有文件是行不通的,因为它没有实现这个接口。
如何使bufio.Writer
实现并将必要的密切调用传递给底层文件?
发布于 2017-03-30 03:01:32
io.WriteCloser
是接口:
type WriteCloser interface {
Writer
Closer
}
它最终“规定”了这两种方法:
Write(p []byte) (n int, err error)
Close() error
bufio.Writer
已经有了一个Write()
方法,因此要使它成为WriteCloser
,只需要一个Close()
方法。
使用noop bufio.Writer
方法扩展Close()
:
type MyWriteCloser struct {
*bufio.Writer
}
func (mwc *MyWriteCloser) Close() error {
// Noop
return nil
}
*MyWriteCloser
类型的值现在是WriteCloser
。这是最简单的扩展。使用它:
bw := bufio.NewWriter(w)
mwc := &MyWriteCloser{bw}
虽然我们可以-and,但我们应该添加一个更有意义的Close()
方法。当bufio.Write
进行缓冲写入时,我们应该在声明它关闭之前刷新它的内部缓冲区:
func (mwc *MyWriteCloser) Close() error {
return mwc.Flush()
}
还请注意,由于bufio.Write
不能关闭(不提供Close()
方法),这不会关闭它的底层io.Writer
,这只是为了符合io.Closer
和io.WriteCloser
接口。
如果您还想关闭基础文件,您还必须存储它,并且在调用bufio.Flush()
(确保所有内容都被写入)之后,如果它没有返回任何错误,那么您也可以继续关闭该文件。
这就是它的样子:
type MyWriteCloser struct {
f *os.File
*bufio.Writer
}
func (mwc *MyWriteCloser) Close() error {
if err := mwc.Flush(); err != nil {
return err
}
return mwc.f.Close()
}
使用它:
// Open a file:
f, err := os.Open("myfile.txt")
if err != nil {
panic(err) // Handle error
}
mwc := &MyWriteCloser{f, bufio.NewWriter(f)}
defer mwc.Close()
// use mwc
https://stackoverflow.com/questions/43115699
复制相似问题