博客信息

IO流之字节流(IO流操作规律、IO流在异常日志文件中的应用)

发布时间:『 2019-06-11 11:16』  博客类别:java基础  阅读(773)

现象

小李飞刀_IO流


小李飞刀_IO流


总结

 

流操作的基本规律;

最痛苦的就是流对象有很多,不知道该用哪一个;

 

 

通过三个明确来完成流对象的选择;

1、明确源和目的;

(1) 源:输入流 InputStream Reader

(2) 目的:输出流 OutputStream Writer

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

(1) 是:字符流

(2) 不是:字节流

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

(1) 源设备:内存、硬盘、键盘

(2) 目的设备:内存、硬盘、控制台

 

根据上面的流操作规律回头分析复制操作


小李飞刀_IO流


小李飞刀_IO流


小李飞刀_IO流



IO流操作GBK编码表与UTF-8(系统默认编码)的问题

package com.javaxl.io.byteStream;

import java.io.*;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-11 22:13
 */
public class IoRuleDemo {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        将键盘输入的汉字,按系统自带的编码表转换成字节,保存到硬盘
//        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\charset.txt")));
        //        将键盘输入的汉字,按指定的UTF-8编码表转换成字节,保存到硬盘
//        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\charset.txt"),"UTF-8"));
        //        将键盘输入的汉字,按指定的GBK编码表转换成字节,保存到硬盘
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\charset.txt"), "GBK"));

        String s = null;
        while ((s = br.readLine()) != null) {
            if ("over".equals(s))
                break;
            bw.write(s);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();

    }
}


不加参数和加上参数UTF-8,生成的文件都是8个字节,因为默认编码集就是UTF-8

小李飞刀_IO流

加上参数GBK,生成的文件都是6个字节

小李飞刀_IO流

其中换行符占用了两个字节,所以在UTF-8中一个汉字最多可以占用3个字节,在GBK中一个汉字最多可以占用2个字节;

 

更换标准输入输出流

package com.javaxl.io.byteStream;

import java.io.*;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-11 22:31
 */
public class ChangeInOutStreamDemo {
    public static void main(String[] args) throws IOException {
        System.setIn(new FileInputStream("C:\\Demo1.java"));
        System.setOut(new PrintStream("C:\\Demo1_change.java"));
//        键盘录入的最常见写法
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String s = null;
        while ((s = br.readLine())!=null){
            bw.write(s);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();
    }
}


IO流在异常日志文件中的应用

异常类的API

小李飞刀_IO流


package com.javaxl.io.byteStream;

import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-11 22:39
 */
public class IoLogDemo {
    public static void main(String[] args) {
        try {
            int[] arr = new int[2];
            arr[2] = 22;
        } catch (Exception e) {
            try {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                String dateStr = sdf.format(new Date());

//                创建日志文件
                PrintStream ps = new PrintStream("C:\\ioLogDemo.log");
//                 给异常日志输出前添加时间
                ps.println(dateStr);
//                改变标准输出流
                System.setOut(ps);
            } catch (Exception ex) {
                throw new RuntimeException("日志文件创建失败!!!");
            }
            e.printStackTrace(System.out);
        }

    }
}


运行结果如下:

小李飞刀_IO流


获取系统信息

package com.javaxl.io.byteStream;

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Properties;

/**
 * @author 小李飞刀
 * @site www.javaxl.com
 * @company
 * @create  2019-06-11 22:49
 */
public class SystemInfoDemo {
    public static void main(String[] args) throws FileNotFoundException {
        Properties p = System.getProperties();
        p.list(new PrintStream("C:\\systemInfo.log"));
    }
}


结果如下

小李飞刀_IO流







关键字:     Java基础       IO流       操作规律       日志应用  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有