1 从标准输入中读取              
按照标准1/0模型, Java提供了System.in、System.out和System.err。在整本书里,我们已经
看到了怎样用System.out将数据写出到标准输出,其中System.out 已经事先被包装成了
printStream对象。System.err 同样也是PrintStream ,但System.in却是一个没有被包装过的未经
加工的InputStream。这意味尽管我们可以立即使用System.out和System.err ,但是在读取
System.in之前必须对其进行包装。
 
通常我们会用readLine一次一行地读取输入,为此,我们将System.in包装成BufferedReader
来使用这要求我们必须用InputStreamReader把System.in转换成Reader。下面这个例子
将直接回显你所输入的每一行。
package com.java.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Echo {
public static void main(String[] args) throws IOException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
String s;
while((s = stdin.readLine()) != null && s.length()!= 0){
System.out.println(s);
} }
}
使用异常规范是因为readLineO会抛出IOException。注意System.in和大多数流一样,通
常应该对它进行缓冲。
 
2 将System.out转换成PrintWriter
System.out 是一个PrintStream ,而PrintStream是一个OutputStream . PrintWriter有一个
可以接受OutputStream作为参数的构造器。因此,只要需要,就可以使用那个构造器把
System.out 转换成PrintWriter:
package com.java.io;

import java.io.PrintWriter;

public class ChangeSystemOut {
public static void main(String[] args) {
PrintWriter out = new PrintWriter(System.out,true);
out.println("Hello, world");
}
}
重要的是要使用有两个参数的PrintWriter的构造器,并将第二个参数设为true ,以便开启自
动清空功能;否则,你可能看不到输出。
 

3 标准1/0重定向
Java的System类提供了一些简单的静态方泣调用,以,允许我们对标准输入、输出和错误IO
流进行重定向:
setIn(InputStream)
setOut(PrintStream)
setErr(PrintStream)
package com.java.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream; public class Redirecting {
public static void main(String[] args) throws IOException {
PrintStream console = System.out;
BufferedInputStream in = new BufferedInputStream(
new FileInputStream("src/com/java/io/Redirecting.java"));
PrintStream out = new PrintStream(
new BufferedOutputStream(
new FileOutputStream("test.out")));
System.setIn(in);
System.setOut(out);
System.setErr(out);
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
String s;
while((s = br.readLine()) != null){
System.out.println(s);
}
out.close();
System.setOut(console);
}
}
这个程序将标准输入附接到文件上,并将标准输出和标准错误重定向到另一个文件。注意,
它在程序开头处存储了对最初的System.out对象的引用,并且在结尾处将系统输出恢复到了该对
象上。
1/0重定向操纵的是字节流, 而不是字符流,因此我们使用的是InputStream和OutputStream,而不是Reader和Writer。
 
 
进程控制  
你经常会需要在Java内部执行其他操作系统的程序,并且要控制这些程序的输入和输出。Java类库提供了执行这些操作的类。
一项常见的任务是运行程序,并将产生的输出发送到控制台。本节包含了一个可以简化这项任务的实用工具。在使用这个实用工具时,可能会产生两种类型的错误:普通的导致异常的错误一-对这些错误我们只需重新抛出一个运行时异常,以及从进程自身的执行过程中产生的错误,我们希望用单独的异常来报告这些错误;
package com.java.util;

public class OSExecuteException extends RuntimeException {
public OSExecuteException(String why){
super(why);
}
}
要想运行一个程序,你需要向OSExecute.commandO传递一个command字符串,它与你在控制台上运行该程序所键入的命令相同。这个命令被传递给java.lang.ProcessBuilder构造器(它要求这个命令作为一个String对象序列而被传递),然后所产生的ProcessBuilder对象被启动:
// Run an operating system command
// and send the output to the console.
package com.java.util; import java.io.BufferedReader;
import java.io.InputStreamReader; public class OSExecute {
public static void command(String command) {
boolean err = false;
try {
Process process = new ProcessBuilder(command.split(" ")).start();
BufferedReader results = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String s;
while((s = results.readLine())!= null){
System.out.println(s);
}
BufferedReader errors = new BufferedReader(
new InputStreamReader(process.getErrorStream()));
// Report errors and return nonzero value
// to calling process if there are problems:
while((s = errors.readLine())!= null) {
System.err.println(s);
err = true;
}
} catch(Exception e) {
// Compensate for Windows 2000, which throws an
// exception for the default command line:
if(!command.startsWith("CMD /C")){
command("CMD /C " + command);
}else{
throw new RuntimeException(e);
}
} if(err){
throw new OSExecuteException("Errors executing " + command);
}
}
}
为了捕获程序执行时产生的标准输出流,你需要调用getInputStream() ,这是因为
InputStream是我们可以从中读取信息的流。从程序中产生的结果每次输出一行, 因此要使用
readLine()来读取。这里这些行只是直接被打印了出来,但是你还可能希望从command()中捕获
和返回它们。该程序的错误被发送到了标准错误流,并且通过调用getErrotStream()得以捕获。
如果存在任何错误,它们都会被打印并且会抛出OSExecuteException ,因此调用程序需要处理
这个问题。
 
下面是展示如何使用OSExecute的示例:
package com.java.io;

import com.java.util.OSExecute;

public class OSExecuteDemo {
public static void main(String[] args) throws Exception{
//这里使用了javap反编译器(随JDK发布)来反编译该程序.
OSExecute.command("javap OSExecuteDemo");
}
}
 
------------------

ThinkJava-标准IO的更多相关文章

  1. 深究标准IO的缓存

    前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...

  2. [APUE]标准IO库(下)

    一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...

  3. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  4. 标准io与文件io

    A: 代码重复: 语句块1: while(判断) { 语句块2: 语句块1: } 上面可以改写为: while(1) { 语句块1: if(判断) break: 语句块2: } B: 标准IO和文件I ...

  5. linux标准IO缓冲(apue)

    为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...

  6. 【linux草鞋应用编程系列】_1_ 开篇_系统调用IO接口与标准IO接口

    最近学习linux系统下的应用编程,参考书籍是那本称为神书的<Unix环境高级编程>,个人感觉神书不是写给草鞋看的,而是 写给大神看的,如果没有一定的基础那么看这本书可能会感到有些头重脚轻 ...

  7. 文件IO函数和标准IO库的区别

    摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...

  8. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  9. (九)errno和perror、标准IO

    3.1.6.文件读写的一些细节3.1.6.1.errno和perror(1)errno就是error number,意思就是错误号码.linux系统中对各种常见错误做了个编号,当函数执行错误时,函数会 ...

  10. 标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能

    2015.2.27星期五,小雨 标准IO实现的复制功能: #include <stdio.h>#include <errno.h> #define N 64 int main( ...

随机推荐

  1. FastCGI介绍及Nginx fastcgi配置优化

    FastCGI介绍 FastCGI是从CGI发展改进而来的.传统CGI接口方式的主要缺点是性能很差,因为每次HTTP服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给HTTP服务 ...

  2. luogu P1141 01迷宫

    https://www.luogu.org/problem/show?pid=1141 还不太会用 BFS 然后就跟着感觉走了一波 经历了很多错误 刚开始的读入 然后BFS的过程 最后T三个点 看到别 ...

  3. 利用HTML中map标签实现整张图片带有可点击区域的图像映射:

    实现效果说明:一整张背景图片,实现图标区域出现链接,可点击跳转到指定页面. <div class="brand"> <img src="images/b ...

  4. 跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击

    跨站脚本功攻击,xss,一个简单的例子让你知道什么是xss攻击 一.总结 一句话总结:比如用户留言功能,用户留言中写的是网页可执行代码,例如js代码,然后这段代码在可看到这段留言的不同一户的显示上就会 ...

  5. 转:Tomcat 7.0配置SSL的问题及解决办法

    原文:https://dong-shuai22-126-com.iteye.com/blog/1830209

  6. UVA-1610 Party Games (构造)

    题目大意:给出一系列字符串,构造出一个字符串大于等于其中的一半,小于另一半. 题目分析:取大小为中间的两个a,b(a<b).实际上就是找出第一个小于b的同时大于等于a的字符串,直接构造即可.要注 ...

  7. linux-android-adt

    本打算带着唐帅弟弟研究几天手机开发,没想到这老弟天天遇到问题,原来认为他除了错误,没想到啊,我一上手也到处 是错误,折磨我们哥俩了,今天我俩干 了几把扑克,PK了一次羽毛球,回来研究了一会,阿门问题解 ...

  8. h5桌面通知Notification

    H5中的桌面通知Notification 前言: 对于一个前端开发者,逛网页总会留意一些新奇的功能,对于上班总会用到Teambition的我,总是能收到Notification...所以今天就来研究下 ...

  9. [svc]线上Iptables重启报错

    线上iptables重启了下发现报错,排查了下 [root@xxxx ~]# /etc/init.d/iptables restart iptables: Setting chains to poli ...

  10. delphi从dll中调用图片资源

    假定你的一个dll中有bmp图片,其中图片的别名为'img'(如何将图片放入dll中百度上有图文教程) 当想将dll中的bmp导出时,可以用如下实例代码: procedure TForm1.FormC ...