@H_404_8@
显示的内容只是来自推理引擎本身的结果,而不是像Prolog’write’语句这样的辅助命令(默认情况下)写入STDOUT.@H_404_8@
我需要在AndroID变量中将“写入”打印的结果捕获到STDOUT以显示给用户.一般的想法(我没有与ListVIEw结合实现)是模拟命令行交互,如果他们运行Java Based Prolog Interpreter终端接口,它将参与其中.@H_404_8@
我想坚持知识工程的领域,而不是进入系统工程,以完成这个项目,所以我很感激任何有关这个问题的见解.@H_404_8@
我的研究引导我here作为进一步研究的途径,但系统的东西很快就超越了我的经验.@H_404_8@
非常感谢提前….@H_404_8@解决方法 经过我自己的研究以及tuProlog开发人员的进一步讨论之后,我有一个解决这个问题的方法,我觉得值得与这个社区分享…
@H_404_8@
该问题的整体背景是让任何Prolog实现在“正确”的AndroID上作为更有趣的应用程序(专家系统,游戏AI和自然语言接口)的基础架构在以后的工作.@H_404_8@
最大的障碍是Prolog是一个基于“控制台”的解释环境,可以打印到STDOUT,而AndroID可以容忍控制台打印活动,默认情况下它会将所有这些 *** 作路由到/ dev / null.@H_404_8@
因此,有两组问题需要解决:(1)是否有任何Prolog可移植到AndroID环境,以及(2)当它被路由到/ dev / null时,如何“正确”处理捕获控制台输出的问题.@H_404_8@
解决(1):我们选择了tuProlog Site,其官方来源可以找到:Google Code Repository – tuProlog.他们设计的prolog被一个JAR文件嵌入,特别是AndroID.他们是我们发现的唯一一个做到这一点的人,他们对开发人员“敏感”.他们的东西是开源Java / AndroID,他们有一个AndroID Prolog应用程序,即将推出更新.询问他们的代码对于找到合适的解决方案是非常宝贵的.@H_404_8@
解决(2):为本研究增加最多价值的链接是:Reading from PrintStream,Convert Java OutputStream to InputStream,最终是最有用的StreamWriter to OutputStream.@H_404_8@
具体来说,需要做的是:@H_404_8@
>创建ByteArrayOutputStream对象以捕获二进制数据
从打印过程到控制台(Sy@R_403_6563@.out).
>在中创建PrintStream对象(使用ByteArrayOutputStream)
设置Sy@R_403_6563@.setout(它控制控制台输出[Sy@R_403_6563@.out.println]去往的位置)
>重新调整系统输出
>将所需的控制台打印输出捕获到字符串变量
>将该字符串(在此AndroID项目的情况下)添加到ListvIEw的一行
>通知ListvIEw数据已更改
>重置ByteArrayOutputStream对象(以避免连接)@H_404_8@
这是代码:@H_404_8@
@H_404_8@
// OutPutStream I/O Experimental Stuff PrintStream orgStream = Sy@R_403_6563@.out; // ByteArray Sub Experimental Stuff ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream psout = new PrintStream(baos,Boolean.TRUE); // Using autoFlush // Instantiate an instance of the Prolog Engine. //Do this only once because it's VERY expensive. Prolog engine; // ReRouting Print Streams // (InsIDe method we need to capture console output) Sy@R_403_6563@.setout(orgStream); // Set the Sy@R_403_6563@ Output Stream String myResult = baos.toString(); // returns the actual text myChatListItems.add(myResult); // Add Text to New ListVIEw Row chatbotAdapter.notifyDataSetChanged(); // notify the Adapter to Refresh baos.reset(); // reset the ByteArrayOutputStream Sy@R_403_6563@.setout(orgStream); // reset the Sy@R_403_6563@ Output Stream
最后的笔记:
tuProlog考虑了控制台打印问题,并围绕它设计了这个特定的实现,使用Listeners和Events的组合来正确地解决Prolog“Write”命令以及其他命令的捕获问题.@H_404_8@
通过仔细阅读用户指南中建立的首选方法,可以非常轻松地完成Strict Prolog查询的解决…开发人员可以快速了解他们需要的内容.@H_404_8@
这是捕获Prolog引擎的功能,比如写,间谍和错误事件更难确定(我最终咨询了开发人员).为此,您需要询问他们的CUIConsole的AndroID实现(而不是他们的CUIConsole的控制台实现,这是’不同’).@H_404_8@
简而言之,答案是这样的:(a)建立一个听众,然后(b)为将要举办的活动做好准备.@H_404_8@
这是代码:@H_404_8@
@H_404_8@
// Establish Prolog engine and it's appropriate Listeners // [Warning,Output,and Spy] engine = new Prolog(); engine.adDWarningListener(this); engine.addOutputListener(this); engine.addSpyListener(this); //// PRolOG CONSolE OUTPUT MECHANISMS *******************************@OverrIDepublic voID onSpy(SpyEvent e) { Log.d(TAG,"** LG'd onSpy => SpyEvent Occured ** " ); Sy@R_403_6563@.out.println("** onSpy => SpyEvent Occured ** \n "); myChatListItems.add( e.getMsg() ); chatbotAdapter.notifyDataSetChanged();}@OverrIDepublic voID onOutput(OutputEvent e) { Log.d(TAG,"** LG'd: onOutput => OutputEvent Occured ** " ); Sy@R_403_6563@.out.println("** onOutput => OutputEvent Occured ** \n "); myChatListItems.add( e.getMsg() ); chatbotAdapter.notifyDataSetChanged();}@OverrIDepublic voID onWarning(WarningEvent e) { Log.d(TAG,"** LG'd: onWarning => WarningEvent Occured ** " ); Sy@R_403_6563@.out.println("** onWarning => WarningEvent Occured ** \n "); myChatListItems.add( e.getMsg() ); chatbotAdapter.notifyDataSetChanged();}
结束注意:对于那些对“Prolog on AndroID”感兴趣的人,我非常乐意提供我编写的任何代码或我拥有的资源,以帮助您完成此过程.请不要犹豫.@H_404_8@ 总结
以上是内存溢出为你收集整理的需要从Android捕获选择性STDOUT以在listview中显示全部内容,希望文章能够帮你解决需要从Android捕获选择性STDOUT以在listview中显示所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)