黑马程序员JAVA基础IO流之流操作规律及读写转换流

  在操作IO流时,常常会迷惑:流对象很多,不知道该使用哪一个?

一.流操作的基本规律:

  通过三个明确来完成:

  1、明确‘源’‘目的’

    源:则使用输入流;InputStream 或者 Reader 。

    目的:则使用用输出流;OutputStream 或者 Writer 。

  2、操作的数据是否是纯文本

    是纯文本:则使用字符流。

    不是纯文本:则使用字节流。

  3、当体系明确后,再明确要使用哪个具体的对象,通过设备来进行区分。

    源设备:内存,硬盘,键盘。

    目的设备:内存,硬盘,控制台。

  当完成以上三个明确,这可以很清楚的选择使用适应的流对象。

二.读写流转换:

  例子:将键盘录入的数据保存到一个文件中。

  首先:明确该处的源可以使用:InputStream或者Reader ;目的:使用OutputStream 或 Writer。

  其次:数据是不是纯文本? 是,则使用Reader 和 Writer。

  最后:源->设备:键盘。对应的对象是System.in ; 目的-> 设备:硬盘。一个文件则使用FileWriter。 

import java.io.*; 
public class TransStreamDemo2 {
    public static void main(String[] args) throws IOException {
//        键盘录入:
        BufferedReader bufr = 
            new BufferedReader(new InputStreamReader(System.in) );
//        输出方式:
        BufferedWriter bufw =
            new BufferedWriter( new FileWriter("D:\\TransStreamDemo2.txt") ) ;
        
        String line = null ; 
        while((line = bufr.readLine()) != null) {
//            当遇到 "over" 则停止录入。
            if ("over".equals(line))
                break ; 
            bufw.write(line) ; 
            bufw.newLine() ; 
        }
        bufw.close() ; 
        bufr.close() ;
    }
}

  因为: public static final InputStream in “标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。在这里我们可以知道 System.in 对应的是字节流,而我们使用的Reader 则是字符流,所以应该将System.in 转换成字符流。 

InputStreamReader isr = new InputStreamReader(System.in) ;

  通过上面的例子,可以知道字节流转换成字符流则可以使用 InputStreamReader 类构造方法,而将字符流转换成字节流则可以使用 OutputStreamWriter 类构造方法。 

三.改变标准输入输出设备:

  系统默认的标准输入和输出: 

    System.out 标准的输出设备,控制台。

    System.in 标准的输入设备,键盘。

  改变标准输入输出设备则可以使用System 类中的两个方法:

    static void setIn( InputStream in) 重新分配“标准”输入流。

    static void setOut(PrintStream out  ) 重新分配“标准”输出流。 

  例子:改变异常信息存储方式: 异常处理日志信息。

  需求:将程序报错的错误信息存储到文本。

 1 public class ExceptionInfo {
 2     public static void main(String[] args) throws IOException {
 3         try {
 4             int[] num = new int[2] ; 
 5             System.out.println(num[3]) ;
 6         }
 7         catch(Exception e) {
 8             try {
 9 //                增加时间:
10                 Date d = new Date() ; 
11                 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ") ;
12                 String s = sdf.format(d) ;
13 //                改变标准输出流。
14                 PrintStream ps = new PrintStream("D:\\exception.log") ; 
15                 ps.println(s) ;
16                 System.setOut(ps);
17             }
18             catch(IOException ex) {
19                 
20             }
21             e.printStackTrace(System.out) ;
22         }
23     }
24 }
原文地址:https://www.cnblogs.com/jbelial/p/3064789.html