IO流3(OutputStreamWriter,改变标准输入输出流)

OutputStreamWriter

  1: class OutputStreamWriterDemo
  2: {
  3: 	public static void main(String[] args) 
  4: 	{
  5: 		//键盘录入
  6: 		InputStream in=System.in;
  7: 		InputStreamReader isr=new InputStreamReader(in);
  8: 		BufferedReader bufr=new BufferedReader(isr);
  9: 
 10: 		OutputStream out=System.out;
 11: 		//将输出语句变成字符流对象,可以直接操作字符串和使用BufferedWriter
 12: 		OutputStreamWriter osw=new OutputStreamWriter(out);
 13: 		BufferedWriter bufw=new BufferedWriter(osw);
 14: 
 15: 		String line=null;
 16: 		while((line=bufr.readLine())!=null)
 17: 		{
 18: 			if("over".equals(line))
 19: 				break;
 20: 			bufw.write(line.toUpperCase());
 21: 			bufw.newLine();
 22: 			bufw.flush();
 23: 		}
 24: 
 25: 		bufw.close();
 26: 		bufr.close();
 27: 
 28: 
 29: 	}
 30: }
 31: 

如果需求是将键盘录入的数据存储到一个文件中去,代码如下:

  1: 
  2: //键盘录入
  3: BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
  4: 
  5: //存储到文件中去
  6: BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt")));
如果需求是将文件中的打印到控制台上,代码如下:
  1: BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("文件名.txt")));
  2: 
  3: 
  4: BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
  5: 

流操作的基本规律:

<1>要明确源和目的

       源:输入流  InputStream和Reader

      目的:输出流 OutputStream和Writer

<2>明确操作的数据是否为纯文本

        如果是纯文本的话,字符流,不是纯文本的话,使用字节流

<3>当体系明确后,在明确使用哪个具体的对象

        通过设备来区分:

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

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

例如:需求为将键盘录入的数据保存到一个文件中去

分析如下:

InputStream   Reader

是不是纯文本?  是,那么使用Reader

设备为键盘,对应的对象是System.in,但是通过以上分析,应该使用Reader呀,System.in对应的是字节流呀。为了操作键盘中的文本数据最方便,转换成字符流按照字符串的操作最方便。因此将System.in转换成Reader。用Reader体系中的转换流InputStreamReader。

  1: InputStreamReader isr=new InputStreamReader(System.in);

是否需要提高效率呢?需要,那么使用BufferedReader

  1: BufferedReader bufr=new BufferedReader(isr);

目的:OutputStream  Writer

是否为纯文本呢?是。Writer

设备为硬盘上的一个文件,FileWriter

  1: FileWriter fw=new FileWriter("c.txt");

是否需要提高效率呢?是。使用BufferedWriter

  1: BufferedWriter bufw=new BufferedWriter(fw);

扩展:如果想要将录入的数据按照指定的编码表(UTF-8)来存储到文件中去

思考:只有转换流可以使用编码表。所以应该使用OutputStreamWriter对象,又因为该转换流对象要接收一个字节输出流,可以操作文件的字节输出流为FileOutputStream

  1: OutputStreamWriter osw=new OutPutStreamWriter(new FileOutputStream("d.txt")),"UTF-8");
  2: 
  3: BufferedWriter bufw=new BufferedWriter(osw);

转换流是字符和字节之间的桥梁,通常,涉及到字符编码转换时,需要使用到转换流。


改变标准输入输出流:

  1: public static void main(String[] args)throws IOException
  2: {
  3: 	//将标准的键盘输入改为从PersonDemo.java文件中读取数据
  4: 	System.setIn(new FileInputStream("PersonDemo.java"));
  5: 
  6: 	//将标准的控制台输出改为把数据存储到zzz.txt文件中去
  7: 	System.setOut(new PrintStream("zzz.txt"));
  8: 
  9: 	BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
 10: 
 11: 	BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
 12: 	String line=null;
 13: 
 14: 	while((line=bufr.readLine())!=null)
 15: 	{
 16: 		if("over".equals(line))
 17: 			break;
 18: 		bufw.write(line.toUpperCase());
 19: 		bufw.newLine();
 20: 		bufw.flush();
 21: 	}
 22: 
 23: 	bufr.close();
 24: 	bufw.close();
 25: }
 26: 

异常的日志信息:

  1: 
  2: public static void main(String[] args)throws IOException
  3: {
  4: 	try
  5: 	{
  6: 		int[] arr=new int[2];
  7: 		System.out.println(arr[3]);
  8: 	}
  9: 	catch (Exception e)
 10: 	{
 11: 		try
 12: 		{
 13: 			Date d=new Date();
 14: 			SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 15: 			String s=sdf.format(d);
 16: 
 17: 			PrintStream ps=new PrintStream("exeception.log");
 18: 			ps.println(s);
 19: 			System.setOut(ps);
 20: 		}
 21: 		catch (IOException ex)
 22: 		{
 23: 			throw new RuntimeException("日志文件创建失败");
 24: 		}
 25: 
 26: 		e.printStackTrace(System.out);
 27: 	}
 28: }
 29: 

SimpleDateFormat  它允许进行格式化(日期---文本),解析(文本---日期)和规范化。

printStackTrace 是Throwable类下的方法,将此throwable及其追踪输出到指定的输出流。

  1: e.printStackTrace(System.out);
  2: 
  3: System.setOut(new PrintStream(“文件名”));
  4: 

将异常内容输出到该文件中,也可以写成:

  1: e.printStackTrace(new PrintStream("文件名"));

系统信息:

  1: public static void main(String[] args)
  2: {
  3:     Properties  prop=System.getProperties();
  4:      
  5:     prop.list(new PrintStream("文件名"));
  6: }
原文地址:https://www.cnblogs.com/mandy920213/p/3535229.html