Lesson_24_Note_java IO系统(下)

package Lesson_24;
/**************************************************************
 * 							2013.3.30
 * 				 	      java IO系统(下)
 * 					  	   @author Gavin
 **************************************************************/
/**********************课堂内容****************************
 * 1、从控制台接受输入:System.in的read方法可以从控制台接受输入
 * 		但由于in实际上是一个InputStream类的对象,它只能以字节形式接收数据,
 * 		并且一次只能接受一个字节,这使输入操作很不便
 * 		必须将System.in进行处理,才可以顺利地从控制台接受输入,这将使用到
 * 		InputStreamReader类和BufferedReader类
 * 2、InputStreamReader类用于将InputStream类型的字节输入流对象转换成
 * 		Reader类型的字符读取流对象
 *   -->InputStreamReader类的构造方法:
 * 		--->InputStreamReader(InputStream in) 将InputStream对象转换成Reader对象
 * 	--->可以使用它来转换System.in,如:
 *		InputStreamReader isr = new InputStreamReader(System.in)
 *	--->这样的字符流效率很低,再使用BufferedReader类来为其建立缓冲,如:	 
 *			BufferedReader br = new BufferedReader(isr);	
 *			这样,就可以从控制台接受输入了
 * 2、对象序列化
 * 		--->将对象转换为字节流保存起来,并在日后还原这个对象,这种机制叫做对象序列化。
 * 			序列化的过程就是对象写入字节流和从字节流中读取对象
 * 		--->java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。
 * 			可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列
 * 			化可以进行对象的“深克隆”,即复制对象本身及引用的对象本身。序列化一个对象可能得到
 * 			整个对象序列
 * 		--->一个对象要想能够实现序列化,必须实现Serializable接口
 * 		--->当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量
 * 		--->如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存
 * 		--->如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会
 * 			抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍
 * 			然可以序列化
 * 		--->ObjectInputStream类 和 ObjectInputStream类
 * 3、NIO——缓冲器Buffer类
 * 	 	新I/O通过使用Buffer读写数据避免了资源浪费。Buffer对象是线性的,有序的数据集合。
 * 		--->每个Buffer有以下的属性
 * 			capacity  这个Buffer最多能放多少数据。capacity一般在buffer被创建的时候指定
 * 			limit   在Buffer上进行的读写操作都不能越过这个下标。当写数据到buffer中时,
 * 					limit一般和capacity相等,当读数据时,limit代表buffer中有效数据的长度
 * 			position   读/写操作的当前下标。当使用buffer的相对位置进行读/写操作时,
 * 						读/写会从这个下标进行,并在操作完成后,buffer会更新下标的值。
 * 		--->Buffer提供了改变以上三个属性的方法
 * 			clear()   清除此缓冲区。将位置设置为 0,将限制设置为容量
 * 			flip()	  将限制设置为当前位置,然后将位置设置为 0
 * 			rewind()  将位置设置为 0,不改变极限	
 * 4、NIO——通道Channel接口
 * 		-->Channel表现了一个可以进行IO操作的通道(比如,通过FileChannel,我们可以对文件进行读写操作)。
 * 		java.nio.channels包含了文件系统和网络通讯相关的channel类。这个包通过Selector和
 * 		SelectableChannel这两个类,还定义了一个进行异步(non-blocking)IO操作的API,
 * 		这对需要高性能IO的应用非常重要
 * 		-->isOpen():判断此通道是否处于打开状态
 * 		-->close();关闭通道
 *********************************************************/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

public class InputStreamReaderTest {
	public static void main(String[] args) throws Exception {
//		InputStreamTest();
//		ObjectSeria();//调用对象序列化方法
//		BufferTest();
		fileChannel();
	}
	public static void InputStreamTest() throws Exception{
		InputStreamReader isr=new InputStreamReader(System.in);//与Scanner类似
			//将控制台输入对象转化成字符流,并建立缓冲流
		BufferedReader bf= new BufferedReader(isr);
		String str=bf.readLine();
		System.out.println("键盘读取到的内容为:"+str);
		File file = new File("readme.txt");
		FileWriter fw=new FileWriter(file);
		fw.write(str);
		fw.flush();
	}
	
	public  static void ObjectSeria() throws Exception{
		//对象序列化。为什么要使用对象序列化
		//数据的保存,称之为“数据的持久化”--->文件或数据库
		List list=new ArrayList();
		Person p=new Person();
		p.setID(11);
		p.setName("Bob");
		p.setMan(true);
		list.add(p);
		p=new Person();
		p.setID(112);
		p.setName("Bob2");
		p.setMan(false);
		list.add(p);
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("Person.txt"));
		oos.writeObject(p);//writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它
		oos.writeObject(list);//写入list
		oos.flush();
		oos.close();
		
		//从文件中读取对象--->反序列化
		Person p2=null;
		ObjectInputStream ois =new ObjectInputStream(new FileInputStream("Person.txt"));
		p2=(Person)ois.readObject();//readObject 方法负责从流中读取并还原类字段,还原对象的非静态和非瞬态字段
		System.out.println(p2.getID()+" "+p2.getName()+" "+p2.isMan());
//		FileOutputStream fos=new FileOutputStream("Person.txt");
//		fos.write(p.toString().getBytes());//此时写入的是对象的字符串表示,并不能保存对象有关的信息
//		fos.flush();
//		fos.close();
		//如果要保存多个对象,可以用ArrayList
	}
	
	public static void BufferTest(){
		CharBuffer chb=CharBuffer.wrap("a as df as adf".toCharArray());
//		for(int i=0;i<chb.length();i++){//为甚么只读了4个呢?
//			System.out.println(chb.get());
//			System.out.println(chb.position());
//		}
		
		for(int i=0;i<chb.capacity();i++){
			System.out.print(chb.get());
		}
		System.out.println("当前位置:"+chb.position());//读写操作的当前下标
	}
	
	public static void fileChannel() throws Exception{
		//Channel:
		FileChannel fc = new FileInputStream("person.txt").getChannel();
		System.out.println("位置:"+fc.position());//从0开始
		System.out.println("大小:"+fc.size());
		byte[] bt= new byte[(int)fc.size()];
		ByteBuffer b= ByteBuffer.wrap(bt);
		fc.read(b);
		System.out.println(new String(bt));//那b有什么用呢?
	}
}

你可能感兴趣的:(Lesson_24_Note_java IO系统(下))