黑马程序员-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 }