You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Clojure/Java中从终端读取超过4096字符的内容?

解决Clojure读取STDIN超长单行的问题

我来帮你搞定这个读取超过4096字符单行的问题~先分析下你之前代码的问题,再给出靠谱的解决方案:

为什么之前的代码行不通?

  1. Scanner方案的问题:
    你用Scanner循环调用.nextInt()的思路本身没问题,但JVM的标准输入流(*in*)默认带有4096字节的缓冲区,当输入单行超过这个长度时,可能会出现读取截断的情况。另外,Scanner依赖默认缓冲区工作,无法自动突破这个限制去读取完整的超长行内容。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:10:33