初级会员
  • 第 19214 位会员
  • w1281472252
  • 2018-06-07 20:25:53
  • Offline
  • 25 63

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 评论了主题 反向读取文件
    7楼 @victorl 前面我改的那个是复杂了,我改了下 ```golang c.fileSize = offset if offset == 0 { _, err = c.bwr.Write([]byte{'\n'}) if err != nil { return err } } else { if c.fileSize > buffSize { c.fileSize = offset + n - 1 } else { c.fileSize = offset + n - 1 c.swapBuff = make([]byte, c.fileSize) } } ```
  • 评论了主题 反向读取文件
  • 评论了主题 反向读取文件
    #7 @victorl 你这边fileSize大于buffSize不会有问题吗,大于时前几轮循环出现数据打印不全的情况
  • 评论了主题 反向读取文件
    #2 @victorl 非常感激,我试了下,有两个地方改了下,一个是文件大小大于buffSize,二是最后一轮m为-1时需要把n前的打印 ```golang package main import ( "bytes" "fmt" "io" "os" ) var ( // buffSize = 1 << 20 buffSize = 1024 buffSizeA = 0 ) // ReadLineFromEnd -- type ReadLineFromEnd struct { f *os.File fileSize int bwr *bytes.Buffer swapBuff []byte swapStatus bool } // NewReadLineFromEnd -- func NewReadLineFromEnd(name string) (rd *ReadLineFromEnd, err error) { f, err := os.Open(name) if err != nil { return nil, err } info, err := f.Stat() if info.IsDir() { return nil, fmt.Errorf("not file") } fileSize := int(info.Size()) rd = &ReadLineFromEnd{ f: f, fileSize: fileSize, bwr: bytes.NewBuffer([]byte{}), swapBuff: make([]byte, buffSize), swapStatus: false, } return rd, nil } // Read -- func (c *ReadLineFromEnd) Read(p []byte) (n int, err error) { err = c.buff() if err != nil { return n, err } return c.bwr.Read(p) } // ReadLine 结尾包含'\n' func (c *ReadLineFromEnd) ReadLine() (line []byte, err error) { err = c.buff() if err != nil { return nil, err } return c.bwr.ReadBytes('\n') } // Close -- func (c *ReadLineFromEnd) Close() (err error) { return c.f.Close() } func (c *ReadLineFromEnd) buff() (err error) { if c.fileSize == 0 { return nil } if c.bwr.Len() >= buffSize { return nil } // 动态修改swapBuff if c.swapStatus { if c.fileSize < buffSize { c.swapBuff = make([]byte, c.fileSize+buffSizeA) } else { c.swapBuff = make([]byte, buffSize+buffSizeA) } } offset := 0 if c.fileSize > buffSize { offset = c.fileSize - buffSize c.swapStatus = true } else { c.swapStatus = false } _, err = c.f.Seek(int64(offset), 0) if err != nil { return err } n, err := c.f.Read(c.swapBuff) if err != nil && err != io.EOF { return err } if n == 0 { return nil } for { m := bytes.LastIndex(c.swapBuff[:n], []byte{'\n'}) if m == -1 { if !c.swapStatus { // 判断是否为最后一轮 _, err = c.bwr.Write(c.swapBuff[:n-1]) // 到上一轮n-1为止的数据输出 if err != nil { return err } _, err = c.bwr.Write([]byte{'\n'}) if err != nil { return err } } buffSizeA = n break } if m < n-1 { _, err = c.bwr.Write(c.swapBuff[m+1 : n]) if err != nil { return err } _, err = c.bwr.Write([]byte{'\n'}) if err != nil { return err } } n = m //从最后一次出现的位置向前寻找 if n == 0 { break } } if n > 0 { _, err := c.bwr.Write(c.swapBuff[:n]) if err != nil { return err } } c.fileSize = offset return nil } func main() { rd, err := NewReadLineFromEnd("./security4.txt") if err != nil { fmt.Println(err) } defer rd.Close() for { data, err := rd.ReadLine() if err != nil { if err != io.EOF { fmt.Println(err) } break } fmt.Print(string(data)) } } ```
  • 我主要写的是一个转发的中间件,不关注客户端和后台的,所以该怎么获取到客户端的连接断开这样我们主动关闭与后端的连接并关闭对应的goroutine