如何在Clojure/Java中从终端读取超过4096字符的内容?
解决Clojure读取STDIN超长单行的问题
我来帮你搞定这个读取超过4096字符单行的问题~先分析下你之前代码的问题,再给出靠谱的解决方案:
为什么之前的代码行不通?
Scanner方案的问题:
你用Scanner循环调用.nextInt()的思路本身没问题,但JVM的标准输入流(*in*)默认带有4096字节的缓冲区,当输入单行超过这个长度时,可能会出现读取截断的情况。另外,Scanner依赖默认缓冲区工作,无法自动突破这个限制去读取完整的超长行内容。BufferedReader方案的问题:
你写错了类名(是java.io.BufferedReader不是BufferReader),而且误用了.read()方法——这个方法每次只能读取单个字符,当然读不完一整行长内容,应该用.readLine()来读取完整的一行。
正确的解决方案
方案1:用BufferedReader读取整行再分割数字
这是最可靠的方式,能确保读取完整的超长行,再把字符串分割成数字列表:
(import 'java.io.BufferedReader) (import 'java.io.InputStreamReader) (let [reader (BufferedReader. (InputStreamReader. *in*)) full-line (.readLine reader)] ; 读取完整的一行 (map #(Integer/parseInt %) (clojure.string/split full-line #"\s+"))) ; 按空白分割并转成整数
方案2:用Clojure内置的slurp简化操作
如果你的输入是一次性的单行内容(不是持续的流输入),可以用slurp直接读取整个标准输入流,再分割转成数字,代码更简洁:
(map #(Integer/parseInt %) (clojure.string/split (slurp *in*) #"\s+"))
注意事项
- 如果你是通过管道或文件重定向输入(比如
cat long-line.txt | clj script.clj),两种方案都能正常工作; - 如果是交互式输入,确保输入完一行后按下回车触发读取,
readLine()会等待换行符来确认行结束。
内容的提问来源于stack exchange,提问作者mreluzeon
相关产品推荐
相关产品推荐

