编辑2 在收到Mathworks支持的回复后,我自己回答了这个问题。简而言之,有一个选项类MWComponentOptions
在实例化时传递给导出的类。除其他外,这可以为错误输出和常规输出(即来自disp()
- 喜欢的函数)指定唯一的打印流。感谢所有的回应:)
=============================================== =====================
一个简单的问题 - 有没有办法阻止MATLAB代码在编译后输出到disp
(和类似)函数的Java控制台? MATLAB中有用的调试信息很快就会成为Java日志中令人讨厌的额外文本。
我正在使用的编译工具是MATLAB Compiler(我认为它与MATLAB Builder JA不同,但我可能错了)。我在mcc
命令上找不到任何好的文档,所以我不确定是否有任何选项。
当然,如果这是不可能的,并且编译器将所有MATLAB代码转换为Java等价物的直接结果那么这完全可以理解。
提前致谢
编辑这对于单独处理Java端的错误报告也很有用 - 目前所有MATLAB错误都会被发送到控制台,无论它们是否被捕获。
答案 0 :(得分:2)
如果在已部署的应用程序(例如MATLAB Compiler或Builder JA)中运行,isdeployed
函数返回true,而在实时MATLAB中运行则返回false。
您可以使用disp
数据块包围if isdeployed
语句。
答案 1 :(得分:2)
我从Mathworks支持请求中回复,他们提供了以下解决方案:
创建导出的任何类时,可以指定MWComponentOptions
对象。这在R2012b中记载的很少,但是对于我想要的内容,以下示例可行:
MWComponentOptions options = new MWComponentOptions();
PrintStream o = new PrintStream(new File("MATLAB log.log"));
options.setPrintStream(o); // send all standard dips() output to a log file
// the following ignores all error output (this will be caught by Java exception handling anyway)
options.setErrorStream((java.io.PrintStream)null);
// instantiate and use the exported class
myClass obj = new myClass(options);
obj.myMatlabFunction();
// etc...
<强>更新强>
如果有人想要取消所有输出,则null
到java.io.PrintStream
,最终会导致部署NullPointerException
。抑制所有输出的更好方法是用于创建虚拟打印流,如:
PrintStream dummy = new PrintStream(new OutputStream() {
public void close() {}
public void flush() {}
public void write(byte[] b) {}
public void write(byte[] b, int off, int len) {}
public void write(int b) {}
} );
然后使用
options.setErrorStream(dummy);
希望这会有所帮助:)
答案 2 :(得分:1)
如果你有一个独立的应用程序并且根本不想打扰类,那么另一个可能的黑客攻击:
在编译期间使用evalc并部署您的func名称:
function my_wrap()
evalc('my_orig_func(''input_var'')');
end
编译如
mcc -m my_wrap my_orig_func <...>
嗯,这显然是另一个黑客。