【问题标题】:In-memory file type objects in ClojureClojure 中的内存文件类型对象
【发布时间】:2013-04-06 22:57:11
【问题描述】:

我刚刚开始使用 Clojure,想调用一个 Java 方法,该方法将一个要读取的输入文件和一个要写入的输出文件作为参数。两者似乎都是 java.io.File 类型。我想调用的方法是这个类中的“解析”:

http://htmltolatex.sourceforge.net/javadoc/cz/kebrt/html2latex/Parser.html

但是,因为我会重复调用该方法,所以我更喜欢使用内存中的对象而不是磁盘上的文件。

我已经成功加载了 Parser 类的一个实例:

(def my_parser (cz.kebrt.html2latex.Parser.))

我相信我已经成功创建了一个类似内存文件的对象,可以使用以下命令从中读取:

(def input-object (java.io.StringBufferInputStream. "this is a test"))

但是,我应该传递什么样的文件(如对象)来捕获输出? (为了完整起见,我要提一下,这个输出文件首先是用来构造一个 ParserHandler 的实例,然后传递给上面创建的解析器。http://htmltolatex.sourceforge.net/javadoc/cz/kebrt/html2latex/ParserHandler.html

感谢您的建议。

【问题讨论】:

    标签: clojure java-io


    【解决方案1】:

    我很确定这个(设计糟糕的)API 适用于旧版本的软件,它不允许你做你想做的事情。 (即,您不能创建内容在内存中的 File。这不是该类的用途。)

    latest version 似乎有一个构造函数,您可以将java.io.FileString 传递给该构造函数。后者应该是你所追求的。

    编辑:我认为为您清理一些东西可能会很好,因为您似乎来自 Python 背景(鉴于您反复使用“类文件”一词)。 java.io.File 是一个误导性名称。它实际上更像是一条路径。例如,如果你想检查一个文件是否存在,你会做(.exists (java.io.File. "my/path"))File 也可以是目录。我知道这很愚蠢,但是嘿,它是java。 (如果您想了解更多信息,请查看here)。这个 Parser 类真正应该提供的是传递java.io.Reader 的能力,这就像一个字符序列的抽象视图。在内部,他们将String 选项和File 选项都转换为Reader,因此他们不只是接受读者并切断中间人,这是非常糟糕的设计。

    【讨论】:

    • 感谢您的澄清,D.J.是的,我来自 Python。
    • 按照您的建议,我将 svn 中的 java 程序重新安装到了我的 Clojure 项目中。这个电话现在看起来正确吗? (对我来说,它正在抛出错误):(cz.kebrt.html2latex.Parser。“这是一个测试”)
    • 首先,该类已移至cz.kebrt.html2latex.parser.Parser,其次,我对源代码进行了适当的探讨,但我不确定在使用字符串构造时它是否符合您的要求。在这种情况下,它会创建一个默认的 ParserHandler,据我所知,它不会向任何地方输出任何内容。我最好的猜测是他们将它用于单元测试。我不认为你可以在不修改源代码的情况下做你想做的事。如果您确实想修改源代码,则只需创建一个采用StringParserHandler 的新构造函数就可以了。不过我不能保证
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2019-09-24
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多