Clojure - Java 互操作:传递一个 OutputStream 参数并返回一个字符串

Posted

技术标签:

【中文标题】Clojure - Java 互操作:传递一个 OutputStream 参数并返回一个字符串【英文标题】:Clojure - Java interop: pass an OutputStream argument and get back a String 【发布时间】:2014-07-02 04:31:36 【问题描述】:

我正在使用一个 java 库,并想调用一个导出数据的方法。

此方法有两种变体:一种带有用作目标文件名的 String 参数,另一种接受 OutputStream 对象并使用 OutputStreamWriter 写入。

我想使用第二种方法,并且能够将 OutputStream 恢复为字符串,这样我就可以用它做任何我想做的事情了。

我不确定这实际上是否可行,但当我发现 clojure.core/with-out-str 时,我希望它是可能的,但我不确定如何使用它。

是否可以从 Clojure 将 OutputStream 参数传递给 Java 方法并以字符串的形式取回写入的数据?

谢谢。

编辑:

实际上,类构造函数接受一个 OutputStream 参数,一个方法通过它写入并关闭它。 希望这会有所帮助。

【问题讨论】:

如果您将ByteArrayOutputStream 传递给您的方法,您应该能够检索写入的数据。看到这个答案:***.com/a/216913/1916789. 工作就像一个魅力。您能否根据您的评论创建一个答案,以便我接受?谢谢。 不确定我应该这样做,因为这基本上是一个重复的问题,我的回答不会包含任何有价值的东西。我建议您自己编写答案,也许包括解决您问题的一段 Clojure 代码。这可能更有帮助。 :) 【参考方案1】:

@xsc 的评论指出了可能的重复,但我仍然会按照他的建议自己发布答案以保留 Clojure 细节的参考。

这就是我最终得到的结果:

(def baos (java.io.ByteArrayOutputStream.))

(-> (SomeClass. baos) .export)
(String. (.toByteArray baos) (. java.nio.charset.Charset defaultCharset))

有关 Charset 的更多信息,请参阅 this answer 中的 cmets。

【讨论】:

(-> (SomeClass. baos) .export) 部分是干什么用的?我只需使用最后一行即可获得输出。

以上是关于Clojure - Java 互操作:传递一个 OutputStream 参数并返回一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

以互操作方式传递对象 - JavaBean 到 C#

以互操作方式传递对象 - JavaBean 到 C#

在 COM 互操作方法中将字符串作为参数传递

通过互操作将字符串数组从 C# 传递到 C++

将 C# 函数指针传递到 C++/CLI 互操作 dll

关于通过 ref、空指针和 IntPtr 传递结构的互操作问题