java之19天 IO 转换流(三)

读取键盘录入
转换流的使用


/**
 * 读取键盘录入
 * System.out : 对应的是标准的输出设备,默认:控制台
 * System.in  : 对应的是标准的输入设备,默认:键盘
 * 
 * 需求:
 * 通过键盘录入数据
 * 当录入一行数据后,就将该行数据进行打印.
 * 如果录入的数据是over,那么 停止录入.
 * 
 * InputStreamReader: 字节转 字符 读取流
 * 通过需求变形2,发现 其实就是读取一行readLine的原理
 * 思考:
 *   能不能直接使用readLine方法完成键盘录入一行数据的读取呢?
 *   readLine()是字符流BufferedReader类的方法
 *   而键盘录入的read方法是字节流InputStream的方法
 *   那么能不能将字节流转换成字符流在使用字符流缓冲区的readLine()方法呢? 
 *   (请看变形3)
 *
 * OutputStreamWriter: 字节转 字符  写入流
 */
public class ReadIn {
	public static void main(String[] args) throws IOException {
		 //method_1();
		 //method_2();
		method_4();
	}
	
	//既然有 字节 --转--字符 读取流 肯定有字节 --转--字符写入流
	public static void method_4() throws IOException{
		
		/*//接受键盘输入
		InputStream in=System.in;
		//转换流读取流:  字节 -->字符
		InputStreamReader isr=new InputStreamReader(in);
		//读取
		BufferedReader bufr=new BufferedReader(isr);*/
		
		//简写 上面三句
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		//设置输出的目的地
		/*OutputStream out=System.out;
		//转换流写入流:   字节 -->字符
		OutputStreamWriter osw=new OutputStreamWriter(out);
		BufferedWriter bufw=new BufferedWriter(osw);*/
		
		//简写 上面三句
		BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}
	
	
	//发现 变形2  其实就是读取一行的原理
	public static void method_3() throws IOException{
		//获取键盘录入对象.
		InputStream in=System.in;
		
		//将字节流转换成字符流对象,使用转换流,InputStreamReader
		InputStreamReader isr=new InputStreamReader(in);
		
		//为了提高效率,将字符串进行缓冲区技术搞笑操作,使用BufferedReader
		BufferedReader bufr=new BufferedReader(isr);
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			System.out.println(line.toUpperCase());
		}
		bufr.close();
	}
	
	//需求 变形2
	public static void method_2() throws IOException{
		InputStream in=System.in;
		StringBuilder sb=new StringBuilder();
		
		while(true){
			int ch=in.read();
			if(ch==13) //13='\r'
				continue;
			if(ch==10){
				String s=sb.toString();
				if("over".equals(s))
					break;
				System.out.println(s.toUpperCase());
				sb.delete(0, sb.length());
			}else{
				sb.append((char)ch);
			}
		}
		
	}

	
	//需求 变形1
	public static void method_1() throws IOException{
		InputStream in=System.in;
		int ch=0;
		while((ch=in.read())!=-1){
			System.out.println(ch);
		}
	}
	
	
	//键盘输入
	public static void method() throws IOException{
		InputStream in=System.in;
		int by=in.read();// 阻塞式方法
		System.out.println(by);
		int by1=in.read();// 阻塞式方法
		System.out.println(by1);
		
		//window中的换行
		System.out.println('\r'+0);  //13
		System.out.println('\n'+0);//10
	}

}


流的一般操作规律


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 1.
 * 源:键盘录入
 * 目的:控制台
 *
 * 2.需求:想把键盘录入的数据存储到一个文件中.
 * 源:键盘
 * 目的:文件
 * 
 * 
 * 3.需求:想要将一个文件的数据打印在控制台上.
 * 源:文件
 * 目的:控制台
 * 
 * 
 * 流操作的基本规律
 * 最痛苦的就是流对象有很多,不知道用那个 
 * 
 * 通过三个明确来完成
 * 1.明确源和目的
 * 		源    : 输入流    InputStream     Reader
 *      目的: 输出流    OutputStream    Writer
 * 2.明确操作的数据是否是纯文本
 *      是    : 字符流   
 *      不是: 字节流 
 * 3.当体系明确后,在明确要使用哪个具体的对象
 *    通过设备来进行区分
 *    源设备    :内存,硬盘 ,键盘
 *    目的设备:内存 ,硬盘,控制台 
 *    
 * 1.需求:将一个文本文件数存储到另一个文件.--复制文件
 *    源     :因为是源,所以使用 读取流   InputStream Reader
 *        是不是操作文本文件?
 *        是: 这是就可以选择Reader. 这样体系就明确了
 *        接下来明确要使用该系统中的哪个对象 
 *        明确设备?--> 硬盘上的一个文件
 *        Rreader 体系中 可以操作文具的对象 是 FileReader.
 *        
 *        FileReader fr=new FileReader("a.txt");
 *        
 *        是否需要提高效率呢?
 *        是! 加入Reader体系缓存去中 的 BufferedReader
 *        
 *        BufferedReader bufr=new BufferedReader(fr);
 *        
 *        
 *    目的 :OutputStream Writer
 *      目的是否是纯文本呢?
 *      是:Writer
 *      设备:硬盘,一个文件
 *      Writer体系中可以操作文件的对象是:FileWriter
 *      
 *      FileWriter fw=new FileWriter("b.txt");
 *       
 *      是否需要提高效率呢?
 *      是! 加入Writer体系缓存去中 的 BufferedWriter
 *      
 *      BufferedWriter bufw=new BufferedWriter(fw);
 *      
 * 练习:将一个图片文件中数据存储到另一个文件中,复制文件,要按照以上格式自己完成三个明确
 *   源:因为是源:所以可以选择读取流是 InputStream Reader
 *     是不是操作文本文件?
 *     不是! 所以选择 InputStream
 *     明确体系中使用的那个对象 ?
 *     明确设备--->硬盘上一个图片
 *     InputStream 体系中可以操作 字节流的对象是 :FileInputStream
 *     FileInputStream fis=new FileInputStream("a.jpg");
 *     
 *     是否要提高效率呢?
 *     是! 加入InputStream体系中缓冲区 BufferedInputStream
 *     BufferedInputStream bufis=new BufferdInputStream(fis)
 *     
 *    目的:OutputStream Writer
 *      图片: OutputStream
 *      硬盘上的一个文件
 *      FileOutputStream fos=new FileOutputStream("b.jpg");
 *      是否提高效率?
 *      是:
 *      BufferedOutputStream bufos=new BufferedOutputStream(fos);
 *      
 *    
 * -----------------------------    
 * 2.需求:将键盘录入的数据保存到一个文件中
 *    源:InputStream Reader
 *       是不是纯文本? 是: Reader
 *       设备:键盘  对应的对象是Sytem.in
 *       不是选择Reader吗? System.in对应的不是字节流吗?
 *       为了操作键盘的文件数据方便,转成字符流按照字符串操作的最方便.
 *       所以既要明确Reader 那么就需要将System.in转成 Reader
 *       用了Reader 体系中的InutStreamReader.
 *       
 *       InputStreamReader isr=new InputSreamReader(System.in);
 *       
 *       需要提高 效率吗? 需要 BufferedReader
 *       BufferedReader bufr=new BufferedReader(isr);
 *           
 *    目的:OutputStream Writer
 *    是否是纯文本?是 Writer
 *    设备:硬盘,一个文件,使用 FileWriter
 *    FileWriter fw=new FileWriter("c.txt");
 *    需要提高效率吗?
 *    BufferedWriter bufw=new BufferedWriter(fw)
 *    
 *      
 *      
 * 扩展下:想要把录入的数据按照指定的编码表(utf-8)将数据保存到文件中
 *   目的: OutputStream Writer
 *    是否是纯文本?是 Writer
 *    设备:硬盘,一个文件,使用 FileWriter
 *    但是FileWriter使用的默认编码表  GBK
 *   
 *    但是要存储的是,需要加入指定的编码表UTF-8 而指定的编码表只有转换流可以指定.
 *    所以要使用的对象是OutputStreamWriter
 *    而该转换流对象要接受一个字节输出流,而且还可以操作文件的字节输出流, FileOutputStream
 *    
 *    OutputStraemWriter osw=new OutputStreamWriter(new FileOutputStream("a.txt"),"UTF-8");
 *    
 *    需要提高效率吗?
 *    是
 *    BufferedWriter bufw=new Buffered(osw);
 *    所以,记住,转换流什么时候用? 字节和字符之间的桥梁,通常,涉及到的字符编码转换时候,需要使用大转换流.
 *    
 */
public class TransStreamDemo2 {

	public static void main(String[] args) throws IOException {
		//method();
		//method_1();
		
		//method_2();
		method_3();
	}
	//读取上面 d.txt 由于是UTF-8所以不能使用 FileReader,因为FileReader 使用 的GBK
	public static void method_3() throws IOException{
		BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("E:\\workspace4\\exam\\d.txt"),"UTF-8"));
		BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}
	
	//输出到指定编码格式的文件中  UTF-8
	public static void method_2() throws IOException, FileNotFoundException{
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d.txt"),"UTF-8"));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}
	
	
	
	//需求2
	public static void method_1() throws IOException{
		BufferedReader bufr=new BufferedReader(new InputStreamReader(new FileInputStream("E:\\workspace4\\exam\\src\\com\\itheima\\day19\\p1\\CopyPic.java")));
		
		BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
		
	}
	//需求2:
	public static void method() throws IOException{
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("outputSteam.txt")));
	
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}

}

改变标准的输入输出设备


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;


/**
 * 改变默认的输出 :控制台
 * 和输入设备:键盘 
 * System.setIn()
 * System.setOut()
 */
public class TransSystemInOutDemo {

	
	public static void main(String[] args) throws IOException {
		method_2();
	}
	//输出到指定编码格式的文件中  UTF-8
	public static void method_2() throws IOException{
		
		//修改源
		System.setIn(new FileInputStream("E:\\workspace4\\exam\\FileReaderDemo_copy.txt"));
		//修改目的
		System.setOut(new PrintStream("zz.txt"));
		
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("over".equals(line))
				break;
			bufw.write(line);
			bufw.newLine();
			bufw.flush();
		}
		bufr.close();
		bufw.close();
	}
}



异常的日志信息

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

/**
 * 异常信息的保存
 * 网络上有个 log4j工具 专门用于处理 日志信息的打印 
 */
public class ExceptionInfo {
	public static void main(String[] args) {
		method_4();
	}
	
	//变形4 加入异常发生的时间
	public static void method_4() {
		try {
			int[] arr=new int[2];
			System.out.println(arr[3]);
		} catch (Exception e) {
			try {
				Date d=new Date();
				SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String s=sdf.format(d);
				PrintStream ps=new PrintStream("exception.log");
				//	ps.print(d.toString());
				ps.println(s);
				System.setOut(ps);
				ps.close();
			} catch (Exception e2) {
				throw new RuntimeException("日志文件创建失败!");
			}
			e.printStackTrace(System.out);
		}
	}
	
	
	//变形 三  发现 还不够完善  没有时间啊 
	public static void method_3() {
		try {
			int[] arr=new int[2];
			System.out.println(arr[3]);
		} catch (Exception e) {
			try {
				System.setOut(new PrintStream("exception.log"));
			} catch (Exception e2) {
				throw new RuntimeException("日志文件创建失败!");
			}
			e.printStackTrace(System.out);
		}
	}
	
	//变形二 打印大文件中去
	public static void method_2() throws IOException{
		try {
			int[] arr=new int[2];
			System.out.println(arr[3]);
		} catch (Exception e) {
			e.printStackTrace(new PrintStream("a.txt"));  //发现原来还打印在控制台了
		}
		
	}
	
	
	//变形一
	//e.printStackTrace() -->里面写的就是 e.printStackTrace(System.out)
	public static void method_1(){
		try {
			int[] arr=new int[2];
			System.out.println(arr[3]);
		} catch (Exception e) {
			e.printStackTrace(System.out);  //发现原来还打印在控制台了
		}
		
	}
	public static void method(){
		try {
			int[] arr=new int[2];
			System.out.println(arr[3]);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}


格式化系统信息输出


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

public class SystemInfo {

	public static void main(String[] args) throws IOException {

		Properties prop=System.getProperties();
		//以前 
		System.out.println(prop);
		
		//Properties 能够和流相连
		prop.list(System.out); //发现还是打印在控制台
		
		//想保存在文件中 
		prop.list(new PrintStream("systemInfo.txt"));  //这个流没有关闭哦 
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值