重定向程序中的系统输入输出

      当一个应用程序写好后,为了调试或其它需要我们往往需要重新定向程序的输入输出,如:将程序的调试信息从控制台记入文件已备分析等。在不改变已有程序的情况下,无论是Windows应用程序还是Java应用程序,都提供了解决办法,都是以将待重定向的应用程序做为子应用程序启动来解决的。下面将分别介绍两种应用程序如何重定向输入输出。
Windows 应用程序
       Windows中启动程序的标准API是CreateProcess,该API有一个LP STARTUPINFO 类型的参数,该结构描述如下:
typedef struct _STARTUPINFO {
 DWORD cb;
 LPTSTR lpReserved;
 LPTSTR lpDesktop;
 LPTSTR lpTitle;
 DWORD dwX;
 DWORD dwY;
 DWORD dwXSize;
 DWORD dwYSize;
 DWORD dwXCountChars;
 DWORD dwYCountChars;
 DWORD dwFillAttribute;
 DWORD dwFlags;
 WORD wShowWindow;
 WORD cbReserved2;
 LPBYTE lpReserved2;
 HANDLE hStdInput;
 HANDLE hStdOutput;
 HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
    其中的hStdInput指应用程序使用的标准输入句柄,hStdOutput指应用程序的标准输出句柄,hStdError指应用程序的标准错误句柄。现在我们就可以通过指明这些参数将应用程序的标准输入输出指向我们需要的任何一个地方了。例如我想将输出重定向到文件debug.txt,下面是代码片断:
       Handle hOutput = CreateFile(“debug.txt”,…);
       STARTUPINFO si;
       si.cb = sizeof(STARTUPINFO);
       si.dwFlags = STARTF_USESTDHANDLES ;
       si.hStdOutput = hOutput;
       Handle hProcess = CreateProcess(“app.exe”,…,&si,…);
且记,编程时一定要为 dwFlags 参数赋值。
Java 应用程序
public class OutputConsole {
    public static void main(String[] args) {
        String cmd[] = {"java","-classpath","./bin","test.OutputApp"};
        Runtime run = Runtime.getRuntime();
        Process process = null;
        BufferedReader br = null;
        try {
            process = (Process)run.exec(cmd);
            InputStream is = process.getInputStream();
            br = new BufferedReader(new InputStreamReader(is));
            String data = null;
            while(true) {
                data = br.readLine();
                if (data == null)
                    break;
                System.out.println("OutputApp:"+ data);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            process.destroy();
        }
    }
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值