啊啊啊小孔 2012-10-25 08:55
浏览 74
已采纳

来自io.ReadCloser的ReadLine

I need to find a way to read a line from a io.ReadCloser object OR find a way to split a byte array on a "end line" symbol. However I don't know the end line symbol and I can't find it.

My application execs a php script and needs to get the live output from the script and do "something" with it when it gets it.

Here's a small piece of my code:

cmd := exec.Command(prog, args)   
/* cmd := exec.Command("ls")*/
out, err := cmd.StdoutPipe()
if err != nil {
  fmt.Println(err)
}
err = cmd.Start()
if err != nil {
  fmt.Println(err)
}

after this I monitor the out buffer in a go routine. I've tried 2 ways.
1) nr, er := out.Read(buf) where buf is a byte array. the problem here is that I need to brake the array for each new line
2) my second option is to create a new bufio.reader
r := bufio.NewReader(out)
line,_,e := r.ReadLine()

it runs fine if I exec a command like ls, I get the output line by line, but if I exec a php script it immediately get an End Of File error and exits(I'm guessing that's because of the delayed output from php)

EDIT: My problem was I was creating the bufio.Reader inside the go routine whereas if I do it right after the StdoutPipe() like minikomi suggested, it works fine

  • 写回答

1条回答 默认 最新

  • drnvcm3949 2012-10-25 10:55
    关注

    You can create a reader using bufio, and then read until the next line break character (Note, single quotes to denote character!):

    stdout, err := cmd.StdoutPipe()
    rd := bufio.NewReader(stdout)
    if err := cmd.Start(); err != nil {
        log.Fatal("Buffer Error:", err)
    }
    
    for {
        str, err := rd.ReadString('
    ')
        if err != nil {
            log.Fatal("Read Error:", err)
            return
        }
        fmt.Println(str)
    }
    

    If you're trying to read from the reader in a goroutine with nothing to stop the script, it will exit.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题