【问题标题】:Start a class with redirected input使用重定向输入启动一个类
【发布时间】:2013-04-21 10:22:27
【问题描述】:

我需要在不触及原始应用的情况下重新格式化 Java 应用的命令行日志记录。我有所有的代码,所以我已经导入到我的项目中。我想做的是找出一种方法来创建一个新的 Process() 或 Thread() 并将 STDOUT 和 STDIN 从该线程重定向到 BufferedReader 和 BufferedWriter。

我想做一个包装器来启动一个新的进程(MyApp.Main(args))。我只是不知道该怎么做,因为它在罐子里。 ProcessBuilder 想要启动一个文件。有什么方法可以将 System.In 和 System.Out 从线程中隔离出来?

我认为找出一种启动线程并从中获取 System.Out/System.In 的方法是最干净的。我该怎么做呢?

【问题讨论】:

    标签: java multithreading redirect process stdout


    【解决方案1】:

    我为此投入了 10 个小时的时间……这就是我想出的……管道流是我所需要的

        int BUFFER = 4096;
        PipedOutputStream toAppPipedOutputStream;
        PipedInputStream toAppPipedInputStream;
    
        static BufferedReader fromAppBufferedReaderfinal;
        BufferedOutputStream fromAppOutputStream;
        PipedOutputStream fromAppPipedOutputStream;
        PipedInputStream fromAppPipedInputStream;
    
        /* constructor sets up logging and parameters */
    
    
               try { 
                    fromAppPipedInputStream = new PipedInputStream(BUFFER);
                    fromAppOutputStream=new BufferedOutputStream(new PipedOutputStream(fromAppPipedInputStream));
                    fromAppBufferedReaderfinal=new BufferedReader(new InputStreamReader(fromAppPipedInputStream));
                    CASUAL.Log.out = new PrintStream(fromAppOutputStream);
    
                    toAppPipedInputStream = new PipedInputStream(BUFFER);
                    toAppPipedOutputStream=new PipedOutputStream(toAppPipedInputStream);
                    CASUAL.CASUALInteraction.in= new BufferedReader(new InputStreamReader(toAppPipedInputStream));
    

    在我的日志和输出类中,默认情况下,我正在写入指向 System.in 的缓冲读取器/写入器。我可以劫持它,因为它是一个公共静态,这是可能的。现在我可以读写我的应用程序,就好像它在我自己的应用程序内的命令行上运行一样

    【讨论】:

    • @CJxD 你是什么意思?就是这个。 CASUAL.Log.out 是对 System.out 的引用,我的程序总是使用它来进行通信,而 CASUAL.CASUALInteractionl.in 是对 System.in 的引用。这会劫持这些引用并将它们重定向到另一个应用程序。可以通过替换它们来对 System.in 和 System.out 执行相同的操作。
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2021-01-07
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多