【问题标题】:How to call a Java program from a Clojure program ?如何从 Clojure 程序调用 Java 程序?
【发布时间】:2016-08-14 02:29:40
【问题描述】:
package javaCodes;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class interm3parse {
public static boolean checkGroup(String str)throws IOException
{
    FileInputStream fis = new FileInputStream(path);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    String line = null;
    while((line=br.readLine())!=null)
    {
        if(line.contains(str))
        {
            return true;
        }
    }
    br.close();
    return false;

}
public static boolean checkPresence(String str) throws IOException
{
    FileInputStream fis = new FileInputStream(filepath);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    String line = null;
    while((line=br.readLine())!=null)
    {
        if(line.startsWith(str))
        {
            return true;
        }
    }
    br.close();
    return false;

}

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    PrintWriter pw = new PrintWriter(new       FileWriter("filepath"));
    FileInputStream fis = new FileInputStream("filepath");
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    String line = null;
    StringBuilder sb = new StringBuilder();
    String s=new String();
    while ((line = br.readLine()) != null)
    {
        s="";
        if(!line.startsWith("defmeasure")||(line==null))
         {
         String[] splitArray = line.split("\\s");
         s=s+splitArray[0];
         //System.out.println(splitArray[0]);
         for(int i=1;i<splitArray.length;i++)
          {
            if(splitArray[i].contains("/"))
            {
                String[] alias = splitArray[i].split("/");
                if(checkPresence(alias[1])||checkGroup(alias[1]))
                {
                    s=s+" "+alias[1];
                }
            }
            else
            {
                s=s+" "+splitArray[i];
            }
          }
         pw.write(s);
         pw.println();
         System.out.println(s);

         }
        else
        {
            //fw.write(line);
            //fw.write("\n");
            System.out.println(line);
            pw.write(line);
            pw.println();   
        }
        }
    pw.flush();
    pw.close();

}//main

}//end of class

我有一个用户定义的 Java 程序(interm3parse.java);我想从 clojure 程序中调用该程序(函数)......这两个代码都可以单独工作......Java 代码在 javaCodes 包中...... .....................clojure 代码在另一个命名空间中...................... .........

Clojure code

(ns javaCodes.generalizedmeasuretocomp )

(defn output-Measure-Criterias-Final []
;;;Java program to replace all group components and remove aliases 

)

【问题讨论】:

    标签: java clojure functional-programming


    【解决方案1】:

    您可以call Java code from Clojure(假设 Java 代码类位于 Clojure 应用程序的类路径中):

    由于您的 Java 类定义了静态方法,您可以这样调用它们:

    (ns javaCodes.generalizedmeasuretocomp
      (:import javaCodes.interm3parse))
    
    (defn output-Measure-Criterias-Final []
      (javaCodes.interm3parse/checkGroup "some string"))
    

    顺便说一句,我注意到您的 Java 代码可能无法正常工作(但我想这仅用于说明目的)。它使用了一些未定义的名称(例如filepath)并且它可能会泄漏资源(当它返回true 时它不会关闭输入流)。

    我认为您应该将资源包装到 try-with-resources 语句中,或者使用 with-open 在 Clojure 中编写该代码:

    (defn file-line-starts-with-str? [filename s]
      (with-open [reader (clojure.java.io/reader filename)]
        (->> reader
          (line-seq)
          (some #(clojure.string/starts-with? % s)))))
    

    【讨论】:

    • 嘿,@Piotrek Bzdyl 我尝试将 java 文件(interm3parse.java)转换为 jar 文件(interm3parse.jar)......并将其添加到我的 clojure 项目的类路径(添加 jar)中..我做了(import interm3parse.interm3parse)但它说Classnotfound异常..我现在该怎么办??
    • 您是如何启动 Clojure 应用程序的?您是否将 iterm3parse.jar 添加到 Clojure 应用程序类路径?
    • 我只是运行 clojure 程序。右键单击->在 REPL 中加载文件 ..当我这样做时,它会给出类未找到异常...
    • Approach2:我在 clojure 项目 (test.java) 中创建了一个 java 程序......当我这样做时 (ns auto-update.core (:import autoupdate.test))......再次说类没有发现异常......我从一天开始就一直在尝试这个......我该如何解决这个问题???
    • 从你的 cmets 我猜你正在使用 Cursive。 Cursive 使用 lein 作为其项目模型,因此您需要按照 lein 网站上的说明操作projects containing Java code。这可能包括将 Clojure 源移动到 src/clojure 下,将 Java 源移动到 src/java 下,并相应地更新 project.clj
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多