1、Print流 分为PrintStream和 PrintWriter 两种

 他们表示的含义可以从他们的构造函数中看出:

 PrintStream extends FilterOutputStream:

 private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {

        super(out);

        this.autoFlush = autoFlush;

        this.charOut = new OutputStreamWriter(this, charset);

        this.textOut = new BufferedWriter(charOut);

    }

    首先它是一个OutputStream的子类

    其次它是一个包裹流,在其输出字节流的基础上包裹了转换流,转换成字符输出流,然后又包裹了一层缓冲输出流

    最后他的flush功能默认是关闭的,所以需要进行开启或者手动flush.

    PrintWriter extends Writer:

    public PrintWriter(OutputStream out, boolean autoFlush) {

        this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);

        // save print stream for error propagation

        if (out instanceof java.io.PrintStream) {

            psOut = (PrintStream) out;

        }

    }

    可以看出PrintWriter对于字节流的处理和PrintStream相同,不过它也可以用Writer流作为参数。

    public PrintWriter(Writer out,boolean autoFlush) {

        super(out);

        this.out = out;

        this.autoFlush = autoFlush;

        lineSeparator = java.security.AccessController.doPrivileged(

            new sun.security.action.GetPropertyAction(“line.separator”));

    }

    

2、关于输出流所提供的功能(方法)对比

    – Writer :// FileWriter\CharArrayWriter

      write(int) 一个字符

      write(char[]) 一个字符数组

      write(char[],offset,len) 一个字符数组的一部分

      write(string,offset,len) 一个字符串或者它的一部分

      

    – OutputStream

      write(int) 一个字节

      write(byte[]) 一个字节数组

      write(byte[],offset,len) 一个字节数组的一部分

      

    – DataOutputStream

      在一个OutputStream的基础上提供以下功能

      writeInt(int) 把一个int型数据按照字节输出。100 –> 0x 00 00 00 64

      writeLong(long) 把一个long型数据按照字节输出。 

    

    – PrintStream 

      首先它继承自OutputStream,是一个字节流

      其次它以字符形式进行输出。也就是说它会自动按照指定的编码把字节中的数据转换为字符,然后进行输出。集合了转换和缓冲输出的功能,参考上面的构造函数

      最后它主要是提供了许多格式化输出功能

      write(int) 字节输出 100 –> 64

      write(byte[],offset,len) // 字节输出

      write(char[]) 字符输出

      write(string) BufferedWriter 字符输出

      print(…) 字符输出 100 –> 100

      println(…) 字符输出 ‘\r\n’

      printf(format,…) 字符输出

      

    – PrintWriter

      它的方法和PrintStream相同。

      关于换行符,在windows下是\r\n, 而在linux下是\n,

      他们的用法基本相同

      public class TestIO {

 public static void main(String[] args) {

  String filename = “D:” + File.separator + “hello.txt”;

  

  File file = new File(filename);

  

  

  try {

   FileOutputStream fout = new FileOutputStream(file);

   

   PrintStream prt = new PrintStream(fout);

   

   prt.write(100); // 文件中内容为64

   

   prt.close();

   fout.close();

   

   

  } catch (FileNotFoundException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  

 }

}        

 

Print 流通常用于标准输出和标准错误,他们默认都是在显示器上进行输出。我们可以更改他们输出到文件,这就是输出重定向,或者叫做标准输出重定向

   System.out 标准输出流

   System.err 标准错误流

        

   System.setErr()

   System.setOut()

  

?Test Code:

 public class TestIO {

 public static void main(String[] args) {

  String filename = “D:” + File.separator + “hello.txt”;

  File file = new File(filename);

  

  System.out.println(“标准输出 — 控制台”);

  

  try {

   //FileOutputStream fileOut = new FileOutputStream(filename);

   PrintStream prt = new PrintStream(file);

   

   System.setOut(prt);

   

   System.out.println(“标准输出重定向 — 文件”);

   

   

  } catch (FileNotFoundException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 

 }

}