gpt4 book ai didi

clojure - 在 Clojure 中检测非空 STDIN

转载 作者:行者123 更新时间:2023-12-02 01:18:14 24 4
gpt4 key购买 nike

如何在 Clojure 中以非阻塞方式读取非空标准输入 (*in*)?

起初,我想用 java.io.Reader#ready() 打电话方法可以,但是即使提供了标准输入,(.ready *in*) 也会返回 false

最佳答案

这是您要找的吗? InputStream .available

(defn -main [& args]
(if (> (.available System/in) 0)
(println "STDIN: " (slurp *in*))
(println "No Input")))

$ echo "hello" | lein run
STDIN: hello

$ lein run
No Input

更新:.available 似乎确实是一个竞争条件检查 STDIN。 n 替代方法是为 STDIN 设置一个固定的超时时间,否则假设没有数据来自 STDIN

这是一个使用 core.async 尝试从 STDIN 读取第一个字节并将其附加到 STDIN 或超时的其余部分的示例。

(ns stdin.core
(:require
[clojure.core.async :as async :refer [go >! timeout chan alt!!]])
(:gen-class))

(defn -main [& args]
(let [c (chan)]
(go (>! c (.read *in*)))
(if-let [ch (alt!! (timeout 500) nil
c ([ch] (if-not (< ch 0) ch)))]
(do
(.unread *in* ch)
(println (slurp *in*)))

(println "No STDIN"))))

关于clojure - 在 Clojure 中检测非空 STDIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41575434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com