当前位置: 首页 > 知识库问答 >
问题:

JavaFX WebView:如何将system.out和system.err转发到Firebug Lite控制台?

陆宝
2023-03-14

共有1个答案

蒲昀
2023-03-14

首先定义一个抽象类

public abstract class FirebugConsole extends OutputStream {

  abstract void log( String msg );

  StringBuilder sb = new StringBuilder();

  @Override
  public void write(int i) {
    sb.append((char)i);
  }

  @Override
  public void flush() {
    if( sb.length() >0 && !sb.toString().equals("\r\n"))
      log(sb.toString());
    sb = new StringBuilder();
  }  
}

然后使用实现对JavaScript的本机调用的方法对其进行扩展。下面是如何编写日志消息的示例

public class FirebugConsoleInfo extends FirebugConsole{
  @net.java.html.js.JavaScriptBody(args = { "msg" }, body = ""
      + "Firebug.Console.log(msg);")
  public native void log( String msg );
}

最后,将system.out和system.err管道到这些对象

  public static void onPageLoad() throws Exception {
  ...
      System.setOut(new PrintStream(new FirebugConsoleInfo(), true));
      System.setErr(new PrintStream(new FirebugConsoleError(), true));
  ...
  }
  public abstract static class FirebugConsole extends OutputStream {
    protected final BrwsrCtx ctx;

    public FirebugConsole( BrwsrCtx ctx ){
      this.ctx = ctx;
    }
    abstract void logNative( String msg );

    void log(String msg) {
      ctx.execute(new Runnable(){
        @Override
        public void run() {
          logNative(msg);
        }
      });
    }

    StringBuilder sb = new StringBuilder();

    @Override
    public void write(int i) {
      sb.append((char)i);
    }

    @Override
    public void flush() {
      if( sb.length() >0 && !sb.toString().equals("\r\n"))
        log(sb.toString());
      sb = new StringBuilder();
    }  
  }

  public static class FirebugConsoleInfo extends FirebugConsole{
    public FirebugConsoleInfo(BrwsrCtx ctx) {
      super(ctx);
    }

    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = ""
        + "Firebug.Console.log(msg);")
    public native void logNative( String msg );

  }

  public static class FirebugConsoleError extends FirebugConsole{
    public FirebugConsoleError(BrwsrCtx ctx) {
      super(ctx);
    }

    @net.java.html.js.JavaScriptBody(args = { "msg" }, body = ""
        + "Firebug.Console.error(msg);")
    public native void logNative( String msg );
    }
 }
  public static void onPageLoad() throws Exception {
      BrwsrCtx ctx = BrwsrCtx.findDefault(GoGPS_Fx.class);
      System.setOut(new PrintStream(new FirebugConsoleInfo(ctx), true));
      System.setErr(new PrintStream(new FirebugConsoleError(ctx), true));
  }
 类似资料:
  • 问题内容: 我需要将System.out / err.println输出重定向到slf4j。 我知道这不是正确记录日志的方法, 但是有一个外部库记录到System.out 问题答案: 您可以使用sysout-over-slf4j。 sysout-over- slf4j模块允许用户将对System.out和System.err的所有调用重定向到SLF4J定义的记录器,该记录器的名称是在其中进行Sys

  • 我想在日志文件中看到我的jnlp标准输出。请建议。p. s.我jnlp在windows下运行,使用log4j记录器

  • 问题内容: 声明为。 但是你可以致电重新分配它。 ??如果是这样怎么可能? (和适用于) 更重要的是,如果你可以对public static final字段进行突变,那么就可以为你提供的保证(如果有)意味着什么?(我从未意识到,也没想到System.in/out/err表现为变量) 问题答案: 通常,最终的静态字段可能不会被修改。然而和是,由于遗留原因,必须允许通过方法来改变最终的静态字段和。我们

  • 问题内容: 请参见下面的代码段 当我多次执行代码时,我会如下随机获得输出,有时System.out语句首先在控制台中打印,有时System.err首先打印。以下是我得到的随机输出 输出1 输出2 为什么会这样呢? 问题答案: 我相信这是因为您正在写入两个不同的输出(一个是标准输出,另一个是标准错误)。这些可能在运行时由两个不同的线程处理,以允许在Java执行期间同时写入两者。假设是这种情况,cpu

  • 问题内容: 在阅读有关Java I / O的知识时,我意识到可以通过两种方式写入标准输出。 以下是同时使用这两种技术的代码段 相对于其他使用,是否有任何性能优势? 问题答案: 一个快速的Google透露了Coderanch上的一个线程很有用。 还有其他几种进行控制台编写的方法,但是除了编写更少的代码外,使用一种或另一种似乎没有真正的好处,而且创建新的PrintWriter对象最终会占用更多的内存。

  • 如何通过Ajax调用将jsonArray发布到spring控制器?? 这是我的JSON数组想通过这个!!