`
Luob.
  • 浏览: 1590074 次
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
读取键盘录入
转换流的使用

/**
 * 读取键盘录入
 * 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"));  //这个流没有关闭哦 
		
	}

}
0
2
分享到:
评论

相关推荐

    Java2 编程21天自学通

    12. **IO流和NIO**:了解Java的IO流体系,以及New IO (NIO) 提供的非阻塞I/O操作。 13. **网络编程**:学习Socket编程,包括TCP和UDP通信,以及ServerSocket和Socket类的使用。 14. **反射机制**:掌握如何在运行...

    Java_day19上课资料.zip

    流分为字节流和字符流,有输入流和输出流之分,还有缓冲流、转换流、对象流等。理解流的层次结构和操作方式对于文件读写、网络通信等场景至关重要。 5. **设计模式**:设计模式是解决常见编程问题的最佳实践,如...

    【IT十八掌徐培成】Java基础第19天_03_定义消息报文.zip

    【IT十八掌徐培成】的Java基础课程涵盖了广泛的编程概念,其中第19天的第3部分专门讲解了“定义消息报文”。在Java编程中,消息报文是通信和网络编程的重要组成部分,它涉及到如何在不同系统或程序之间交换信息。...

    2014年Java最全面试题以及答案.

    Java序列化是将对象状态转换为可保持或传输的格式(例如,将对象以字节流的形式保存在文件中)的过程。要使一个类可序列化,该类必须实现Serializable接口。 6. 一个".java"源文件中是否可以包括多个类(不是内部类...

    Java JDK实例宝典

    4 使用异常的技巧与原则 第7章 IO——输入输出流 7. 1 获取文件的属性信息 7. 2 列出指定目录下的文件 7. 3 创建文件和目录 7. 4 删除文件和目录 7. 5 移动文件和目录 7. 6 复制文件和...

    Java企业级开发综合技能知识总结

    - 包:`java.lang`, `java.util`, `java.io`, `javax.servlet`, `javax.persistence`。 - 接口:`List`, `Set`, `Map`, `Runnable`, `Callable`。 36. **java中会存在内存泄漏吗,请简单描述** - Java中的内存...

    Java后端面试题

    `java.util`、`java.io`等包;`Comparable`、`Serializable`等接口。 34. **内存泄漏**:在Java中,由于垃圾回收机制的存在,内存泄漏较少见,但仍然可能发生。 35. **实现多态的机制**:基于继承和接口实现。 36...

    Java 2实用教程(第三版)实验指导与习题解答

    Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 ...

    Java企业面试题整理及答案

    - **Java序列化**: 是一种将对象的状态转化为字节流的过程,目的是为了保存对象状态或者在网络上传输对象。 - **实现序列化**: 实现序列化的类需要实现 `Serializable` 接口,并且可以使用 `ObjectOutputStream` 和 ...

    java经典面试题.doc

    - **包**:`java.lang`、`java.util`、`java.io`、`java.awt`、`javax.swing` - **接口**:`Runnable`、`Comparable`、`Comparator`、`Iterable`、`Callable` #### 36. java中会存在内存泄漏吗,请简单描述。 理论...

    JAVA面试题目

    常用的包有java.lang、java.util、java.io等。常用接口有Comparable、Serializable、Cloneable等。 20. 类的反射机制 反射机制允许程序在运行期间访问和操作类、方法、接口等的内部信息。 21. 如何唤起类中的一个...

    java常见笔试题目总结

    - **序列化**:将对象的状态转换为字节流的过程,以便于在网络上传输或保存到磁盘上。 - **实现**:实现`Serializable`接口或使用`Externalizable`接口。 示例: ```java import java.io.Serializable; public ...

    整合了所有java经典面试题

    - 使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`类来序列化和反序列化对象。 7. **一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?** - 可以包含多个类,但只有一个公共...

    Java面试题以及答案

    在Java中,通常将对象转换为字节流。 - **实现方式**:让类实现`Serializable`接口,然后使用`ObjectOutputStream`和`ObjectInputStream`类进行对象的序列化和反序列化。 #### 7. 一个".java"源文件中是否可以包括...

    JAVA面试题全集

    - 获取某个日期是否是当月的最后一天:可以使用 `java.time.LocalDate` 类的方法。 - 格式化日期:使用 `java.text.SimpleDateFormat` 或 `java.time.format.DateTimeFormatter`。 5. **数组和集合** - 数组是...

    java基础知识

    #### 第19天~第21天:Java中的各种集合容器使用 1. **集合框架概述**: - 集合的定义与分类:List、Set、Map。 - Collection与Map接口的区别。 - Iterator与ListIterator迭代器。 2. **常用集合类**: - List...

    java面试题(尚学堂内部培训资源,绝对值得一看)

    - 包:`java.util`、`java.io`、`java.lang`、`java.sql`、`javax.servlet` - 接口:`Runnable`、`Callable`、`Comparator`、`Serializable`、`Cloneable` #### 36. java中会存在内存泄漏吗,请简单描述。 尽管...

    javaNote 笔记

    14. **Java标准库**:深入理解Collections、IO、NIO、并发工具包等核心API的使用。 15. **JVM原理**:虚拟机的工作原理,如类加载机制、内存模型、字节码执行等。 16. **Spring框架**:依赖注入、AOP(面向切面...

    java面试笔试题用到的

    - **列出目录下所有文件**:使用`java.io.File`类的`listFiles()`方法。 - **列出目录下所有子目录**:同样使用`File`类,结合递归算法。 - **判断文件或目录是否存在**:使用`File.exists()`方法。 - **读写文件**...

Global site tag (gtag.js) - Google Analytics