浅谈标准输入输出流

本文 内容

                 1.标准输入输出的重定向

                 2.命令行中标准输入输出重定向的实现

                 3.标准输入输出重定向存在的一些问题

前言

                  从我们进入编程的世界那一刻起,我们的工作就离不开标准输入输出了。在windows系统中,我们一般通过在命令提示符即cmd.exe中输入命令执行各项任务。我们可以输入 dir 命令获取当前文件目录信息,这些文件信息会立刻回显在cmd.exe控制台下。如果我们想再次获取目录信息,我们需要再次在命令行下重复性的输入dir命令。

一、标准输入输出的重定向

             1.标准输入输出重定向是什么 

                 标准输入stdin  以cmd.exe为例,我们在执行某些任务的时候,需要与控制台进行必要的交互,这个交互过程需要我们在控制台中进行一系列的输入来响应程序的执行,此时这个输入的过程可以认为是标准输入,此时对进程而言,完成输入的是用户,也就是计算机的使用者。

                 标准输入stdout   标准输出是相对标准输入而言,我们在控制台输入指令之后,计算机程序可能会对我们的输入会有一定的反馈,它会在控制台打印出 响应信息。

                 标准错误stderr  标准错误类似标准输出,其中包含程序处理的一些错误信息的输出,可以和标准输出合并使用

                 输入输出的过程可以比喻成两个熟人一问一答式的打招呼,A 对 B说 Hello,B !  B可能会回答 Hi ,A。那么A和B则完成这个输入输出的过程。对B而言,A是输入,而对A而言,B是输出。

                 对于计算机而言,信息以数据的形式存在。上面A与B交互的过程则是信息交换的过程,上面A和B打招呼通过语言,通过声音的形式完成信息的交换。那么如果A和B不通过说话的方式如何打招呼呢,显然可以通过传字条、拍肩膀、使眼神等其它形式完成这个过程。

                 输入输出重定向大体类似这个过程。首先它是不改变程序的功能,只是改变了信息传输的方式或者说载体。程序的输入从控制台输入转变成了从文件输入,程序的输出从控制台的回显变成了从文件回显。

             2.标准输入输出重定向的好处

                 那么这个过程有什么好处呢,显而易见的好处是 减少了大量重复繁琐的输入,保证了输入的准确性。毕竟当输入很多的时候人为输入出错率很高。而输出到文件,实现了信息的持久化保存,而且方便其它的程序对信息的利用。比如分析程序运行日志的进行排错的时候。整个重定向过程从需要人为交互变成了自动完成,减少了人为参与的时间。

              

二、命令行中标准输入输出重定向的实现

           1.标准输入通过  <  符号实现

               以sort命令为例,标准输入前,我们需要在命令行中输入一定量的数据实现对这些数据进行排序

              

                如上图所示,我们需要输入n行的数据并且使用ctrl+z 结束输入来完成排序的过程。我们可以把这个输入的数据录入到文件中去并实现从文件读写。 

需要注意的是 当 使用start启动新进程 并进程新进程的输入重定向的时候 需要使用^ < 代替 <

当然,这种情况下输出也要参考输入 

      

       2.标准输入通过管道符实现 | 

              还是以上面的sort命令为例,它可以从文件读取输入,还可以把其它进程的输出作为它的输入。从狭义存储的角度来看,文件代表了磁盘存储,其它进程的输出代表了内存存储。重定向输入面向的其实还是数据本身。

             windows操作系统下 type命令可以打印文件的信息

              

              此时type命令结合管道符 | 可以实现sort命令接受来自进程的输出作为它的输入

              

      3.标准输出 使用 >  符号实现

                

       4.标准输入输出结合同时使用

                   

        5.标准错误流可以使用 2 >&1 实现

             标准错误流类似于标准输出流,经常和标准输出流合并起来使用。

三、标准输入输出重定向存在的一些问题

        由于父子进程存在一定的继承关系,所以子进程默认继承了父进程的标准输入输出流。以java程序为例,java 进程使用 ProcessBuilder 类启动新进程

        

          可以通过proc.getInputStream()来读取进程输出,通过proc.getOutputStream写入进程输入。,如果processBuilder指定了 inheritIO(),将无法从proc.getInputStream()读取任何数据,也无法从proc.getOutputStream写入任何数据。

           而且是否能够实时读取子进程的输出取决于子进程是否在合适的时机调用flush 刷新输出缓冲。

       

       

         

                  

            

                

              

                   

               

                  

                  

猜你喜欢

转载自blog.csdn.net/weixin_38526093/article/details/130187820