现象
总结
流操作的基本规律;
最痛苦的就是流对象有很多,不知道该用哪一个;
通过三个明确来完成流对象的选择;
1、明确源和目的;
(1) 源:输入流 InputStream Reader
(2) 目的:输出流 OutputStream Writer
2、操作的数据是否为纯文本
(1) 是:字符流
(2) 不是:字节流
3、当体系明确后,再明确要使用哪个具体的对象,通过设备来进行区分;
(1) 源设备:内存、硬盘、键盘
(2) 目的设备:内存、硬盘、控制台
根据上面的流操作规律回头分析复制操作
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
加上参数GBK,生成的文件都是6个字节
其中换行符占用了两个字节,所以在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();
}
}
异常类的API
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);
}
}
}
运行结果如下:
获取系统信息
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")); } }
结果如下
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有