zoukankan      html  css  js  c++  java
  • 黑马程序员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 }
  • 相关阅读:
    kettle在linux下执行任务
    activemq spring 集成与测试
    mysql创建存储过程,定时任务,定时删除log
    dubbo-admin 无法支持JDK1.8
    自定义事件驱动加异步执行
    AOP 实现自定义注解
    mybatis-plus的学习
    阿里巴巴架构师的成长之路
    Redis错误:jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
    freemark基础知识
  • 原文地址:https://www.cnblogs.com/jbelial/p/3064789.html
Copyright © 2011-2022 走看看