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();
}
}