疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java io重定向标准输入和输出


 

   

  一. 点睛

  我们知道,java默认的标准输入设备是键盘,默认的标准输出设备是显示器,也就是说我们使用java进行物理输入输出编程的时候,如果没有特殊的设定,则System.in默认接收的是键盘输入,System.out则默认输出到显示器屏幕。

  如果想改变默认的输入和输出设置,则可以利用System类提供的重定向输入输出方法进行修改。System类提供了下面三个标准的输入输出方法:

  1. 重定向标准输入流

  public static void setIn(InputStream in);

  2. 重定向标准输出流

  public static void setOut(PrintStream out);

  3. 重定向标准错误输出流

  public static void setErr(PrintStream err);

  二. 示例

  1. 重定向标准输入

  下面的例子使用System类的setIn(InputStream in)方法将System.in的输入来源重定向为文件输入,而不再是键盘输入。业务含义是读取文件自身的内容,然后输出到控制台,代码如下所示:

  package org.light4j.io.redirect;

  import java.io.FileInputStream;

  import java.io.FileNotFoundException;

  import java.io.IOException;

  import java.util.Scanner;

  /**

  * 重定向输入测试类

  *

  *

 

  * 读取自身文件内容然后输出到控制台

  *

 

  *

  *

  */

  public class RedirectInput {

  public static void main(String[] args) {

  // 获取工作目录

  String workDir = System.getProperty("user.dir");

  // 获取类名

  String className = Thread.currentThread().getStackTrace()[1].getClassName();

  // 类的路径

  String classPath = workDir + "\src\main\java\" + className;

  // 反斜杠替换掉"."

  String currentClass = classPath.replace(".", "\") + ".java";

  Scanner sc=null;

  try

  (

  //新建字节输入流,读取文件自身内容

  FileInputStream fis = new FileInputStream(currentClass);

  )

  {

  //重定向标准输入流到FileInputStream

  System.setIn(fis);

  //使用System.in获取标准输入,创建Scanner对象

  //下面的代码sc = new Scanner(System.in)不能和上面的代码System.setIn(fis)位置互换

  //必须先重定向输入流

  sc = new Scanner(System.in);

  //使用回车作为分隔符

  sc.useDelimiter(" ");

  while(sc.hasNextLine()){

  //输出内容到标准输出

  System.out.println(sc.nextLine());

  }

  } catch (FileNotFoundException e) {

  e.printStackTrace();

  } catch (IOException e1) {

  e1.printStackTrace();

  }finally{

  if(sc!=null){

  sc.close();

  }

  }

  }

  }

  运行上面程序之后可以看到,程序并不会等待键盘输入,而是直接在控制台输出了本类RedirectInput.java的代码。这说明程序不再使用键盘作为标准的输入,被重定向为使用文件作为输入源读取数据。

  2. 重定向标准输出

  下面的例子使用System类的setOut(PrintStream out)方法将System.out的输出重定向输出到文件里面,而不是输出到屏幕上,代码如下所示:

  package org.light4j.io.redirect;

  import java.io.FileNotFoundException;

  import java.io.FileOutputStream;

  import java.io.IOException;

  import java.io.PrintStream;

  /**

  * 重定向输出测试类

  *

  *

  */

  public class RedirectOutput {

  public static void main(String[] args) {

  try

  (

  // 创建字节输出流,指定文件为output.txt

  FileOutputStream fos = new FileOutputStream("output.txt");

  //使用PrintStream包装结点流

  PrintStream ps = new PrintStream(fos);

  )

  {

  //将输出流重定向到PrintStream

  System.setOut(ps);

  //输出字符

  System.out.println("忆高考 ");

  System.out.println("年年忆今朝,忙忙赶国考; ");

  System.out.println("不成真秀才,只图自逍遥。 ");

  } catch (FileNotFoundException e) {

  e.printStackTrace();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  运行上面程序之后可以看到在控制台并没有任何的打印信息,这说明原来的标准输出被重定向了,不再是输出到屏幕上;并且可以看到在当前的工作空间下会生成一个新的文件output.txt,里面的内容就是我们上面的输出字符。