Как я могу скомпилировать класс Java, хранящийся в строке, или использовать его путь с заданным вводом? - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь сделать свою собственную красивую печать для файлов Java, похожую на JDoodle. Как я могу скомпилировать java-класс, учитывая либо его местоположение в виде строки, либо его содержимое в виде строки, а также сделать это с заданным текстовым файлом для ввода std, все время записывая вывод в виде отдельной строки. Извините, если это кажется проблематичным. Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: я знаю о java.tools.ToolProvider и Tool, но даже если это решение, я не знаю, что с ним делать, так как документация слишкомсбивает с толку или слишком редкий.

1 Ответ

0 голосов
/ 21 октября 2019

ОК, я получил ответ. Я использовал компилятор Eclipse (потому что у меня в школе нет JDK) для компиляции и использовал processbuilder для запуска созданного файла .class, перенаправляя вывод с помощью redirectOutput в файл, который я прочитал, чтобы получить вывод. Спасибо - вот код.

/*PRETTYPRINT*/
/*
 * Code to HTML
 * Uses highlightjs in order to create a html form for your code, you can also give inputs and outputs
 * */

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;

public class PrettyPrint {
    public static void main(String[] args) throws FileNotFoundException{
        String javaFile = readFile(args[0]);
        String commandLine = readFile(args[1]);
        String output = readFile(args[2]);
        String html = "<!DOCTYPE html>\n"
                +"<html>\n"
                +"<head>"
                +"<link rel=\"stylesheet\" href=\"highlightjs/styles/a11y-dark.css\" media= \"all\">\r\n"
                +"<script src=\"highlightjs/highlight.pack.js\"></script>\r\n"
                +"<script>hljs.initHighlightingOnLoad();</script>"
                +"<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js\" integrity=\"sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/\" crossorigin=\"anonymous\"></script>\r\n"
                +"<script src=\"https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js\"></script>"
                +"<meta charset=\"utf-8\">"
                +"<style>code{overflow-x: visible;}body{background-color:#888888;color:#444444;}h1{text-align:center;color:#444444;}</style>"
                +"</head>"
                +"<body style=\"font-family: 'Consolas';\">\n"
                +"<h1 style=\"text-align: center\">Java Code</h1>"
                +"<pre><code class=\"java\" style=\"overflow-x:visible\">"
                +toHTML(javaFile)
                +"
"+"
\ n "+"

Входы

"+"
<code class = \"nohighlight hljs\" style=\"overflow-x:visible\">"
                +toHTML(commandLine)
                +"</code>
"+"
\ n "+"

Вывод

"+"
<code class = \"nohighlight hljs\" style=\"overflow-x:visible\">"
                +toHTML(output)
                +"</code>
"+" \ n "+" "+" console.log (document.body.innerHTML); "//+String.format("function print() {const filename = '% s'; html2canvas (document.body) .then (canvas => {let pdf = new jsPDF ('p', 'mm', 'a4'); pdf.addImage (canvas.toDataURL('image / png'), 'PNG', 0, 0, 1000, 1000); pdf.save (filename);});} print (); ", args [3] .substring (args [3]. lastIndexOf ('/') + 1, args [3] .length () - 4) + "pdf") + "" + " \ n"; //System.out.println(html); try {File file = новый файл ("output.html"); PrintWriter fileWriter = новый PrintWriter (файл); fileWriter.print (html); fileWriter.close ();} catch (IOException e) {e.printStackTrace ();}} публичная статическая строка toHTML (String str) {String html = str; html = html.replace ("&", "&"); html = html.replace ("\" "," ""); html =html.replace ("\ '", "'"); html = html.replace ("<", "<"); html = html.replace (">", ">"); // html = html. replace ("\ n", "
"); html = html.replace ("\ t", "");html + = "
";вернуть HTML;} public static String readFile (String filePath) {String content = "";try {content = new String (Files.readAllBytes (Paths.get (filePath))));} catch (IOException e) {e.printStackTrace ();} вернуть контент;}}
/**PROCESSBUILDEREXAMPLE**/

import java.io.*;
import org.eclipse.jdt.core.compiler.CompilationProgress;
import org.eclipse.jdt.core.compiler.batch.BatchCompiler;

public class ProcessBuilderExample {
    private static String JAVA_FILE_LOCATION;

    public static void main(String args[]) throws IOException{
        JAVA_FILE_LOCATION = args[0];
        CompilationProgress progress = null;
        BatchCompiler.compile(String.format("-classpath rt.jar %s",args[0]), new PrintWriter(System.out), new PrintWriter(System.err), progress);

        Process process = new ProcessBuilder("java", "-cp",
                JAVA_FILE_LOCATION.substring(0,JAVA_FILE_LOCATION.lastIndexOf("\\")),
                JAVA_FILE_LOCATION.substring(JAVA_FILE_LOCATION.lastIndexOf("\\")+1,JAVA_FILE_LOCATION.length()-5))
                .redirectInput(new File(args[1]))
                .redirectOutput(new File(args[2])).start();
        try {
            process.waitFor();
            PrettyPrint.main(args);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Сохраните эти 2 в одной папке и запустите processbuildereample с 3 аргументами. Loc кода, loc файла ввода и выходного файла для записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...