Golang意外的EOF

时间:2018-06-29 16:13:34

标签: go eof deflate

这是我的代码,我是Go的新手。 我曾尝试使用Google搜索该问题,但我对此完全没有把握。 我认为这与Read()方法有关。

flex-basis: 216px;

这是输出

dylan @ skynet:〜/ Documents / EXP / jc $ ./jc data.txt.jc

[./ jc data.txt.jc]

未压缩数据:2364480

2018/06/29 21:41:35意外的EOF

2 个答案:

答案 0 :(得分:3)

您参与进来了,输出混杂在一起。

flate.NewReader将压缩的输入作为io.Reader,并返回一个io.ReadCloser,可用于获取未压缩的输出:

func (r *compressor) decompress() []byte {
    dc := flate.NewReader(bytes.NewReader(r.content))
    defer dc.Close()
    rb, err := ioutil.ReadAll(dc)
    if err != nil {
        if err != io.EOF {
            log.Fatalf("Err %v\n read %v", err, rb)
        }
    }
    return rb
}

答案 1 :(得分:3)

在对有问题的特定代码进行跟踪之后,我得到了以下答案。

/src/bytes/reader.go 70

func (r *Reader) ReadByte() (byte, error) {
    ...

    if r.i >= int64(len(r.s)) {
        return 0, io.EOF
    }

    ....
}

字节/读取器中有四个函数可以返回io.EOF,零个函数可以返回io.ErrUnexpectedEOF。可以返回io.EOF的四个函数是:

Read(b []byte)
ReadAt(b []byte, off int64)
ReadByte()
ReadRune()

/src/compress/flate/inflate.go 698

func (f *decompressor) moreBits() error {
    c, err := f.r.ReadByte()
    if err != nil {
        return noEOF(err)
    }

    ...
}

在可以返回io.EOF的四个函数中,flate / inflate.go中只有一个函数调用它们中的任何一个:moreBits()调用ReadByte()

/src/compress/flate/inflate.go 690

func noEOF(e error) error {
    if e == io.EOF {
        return io.ErrUnexpectedEOF
    }

    ...
}

moreBits()收到错误时,它将调用noEOF(),它检查是否收到了io.EOF。如果是这种情况,则返回io.ErrUnexpectedEOF。一切似乎都按预期进行,似乎需要用户注意这种特殊情况。建议对上面的代码进行编辑,以处理似乎已定义的行为:

func (r *compressor) decompress() []byte {
    dc := flate.NewReader(bytes.NewReader(r.content))
    defer dc.Close()
    rb, err := ioutil.ReadAll(dc)
    if err != nil {
        if err != io.EOF && err != io.ErrUnexpectedEOF {
            log.Fatalf("Err %v\n read %v", err, rb)
        }
    }
    return rb
}

已在go1.12.9下进行了检查