MATLAB® отображает сообщения об ошибке и вывод от функций, которые не отключены с точкой с запятой в окне команды MATLAB. Можно перенаправить этот вывод к Java® с помощью java.io.StringWriter
. feval
MatlabEngine
, fevalAsync
, eval
и методы evalAsync
поддерживают использование потоков вывода, чтобы перенаправить MATLAB вывод.
Команда whos
MATLAB отображает информацию о текущих переменных рабочей области в окне команды MATLAB. Используйте StringWriter
, чтобы передать этот вывод потоком на Java.
import com.mathworks.engine.*; import java.io.*; public class RedirectOutput { public static void main(String[] args) throws Exception { MatlabEngine engine = MatlabEngine.startMatlab(); // Evaluate expressions that create variables eng.evalAsync("[X,Y] = meshgrid(-2:.2:2);"); eng.evalAsync("Z = X.*exp(-X.^2 - Y.^2);"); // Get the output of the whos command StringWriter writer = new StringWriter(); eng.eval("whos", writer, null); System.out.println(writer.toString()); writer.close(); eng.close(); } }
Этот пример кода пытается оценить выражение MATLAB, которое имеет синтаксическую ошибку (несбалансированные одинарные кавычки). Ввод этого оператора в MATLAB вызывает ошибку:
disp('Hello'')
MATLAB возвращает это сообщение об ошибке в командном окне:
disp('Hello'')
↑
Error: Character vector is not terminated properly.
Чтобы перенаправить это сообщение об ошибке на Java, используйте StringWriter
с методом eval
. Отловите исключение MatlatSyntaxException
, выданное ошибкой, и запишите сообщение об ошибке MATLAB в Java.
import com.mathworks.engine.*; import java.io.*; public class javaRedirectOut { public static void main(String[] args) throws Exception { MatlabEngine engine = MatlabEngine.startMatlab(); StringWriter writer = new StringWriter(); try { eng.eval("disp('Hello'')", null, writer); } catch (MatlabSyntaxException e) { System.out.println("Error redirected to Java: "); System.out.println(writer.toString()); } writer.close(); eng.close(); } }