java 对象流和转换流:Serializable、ObjectOutputStream 、ObjectInputStream、InputStreamReader、OutputStreamWriter
Day18个人总结
一、对象流
作用: 1、让对象在不同网络上进行传递 2、将对象存入文件,需要讲对象序列化,所谓的序列化就是将对象转化为字节的过程 对象流:就是将对象序列化以后的字节存储到本地 具体实现过程分为以下几步: 1、创建要存储的类(类中属性加上transient修饰符值将不会被写入文件) 2、使创建的类实现序列化接口 这里需要注意的是类在实现序列化接口(implements Serializable)会有告警,是因为有给这个类发布版本信息发布版本信息如下:
3、使用这个类创建对象并且赋值 4、创建对象流 5、将对写入文件 对象流的读写: 对象流的特点是需要先写后读取,多个对象流的读取时按照存储顺序来读取的,并且不能跳过任何一个对象。 对象流写入和读取代码如下:(关键代码) ObjectOutputStream oos1 = null; //创建person对象 Person person1 = new Person("kobe",18); Person person2 = new Person("TD",19); ObjectInputStream ois1 = null; try { fos1 = new FileOutputStream(new File("a.txt")); //创建对象以及要写入的文件 oos1 = new ObjectOutputStream(fos1); //将对象序列化写入到文件中 oos1.writeObject(person1); oos1.writeObject(person2);
//创建要读取文件的对象 ois1 = new ObjectInputStream(new FileInputStream(new File("a.txt"))); //这个类本身就是person类型 所以可以向下转型 Person object1 = (Person)ois1.readObject(); System.out.println(object1); Person object2 = (Person)ois1.readObject(); System.out.println(object2); } |
二、转换流
作用以及使用目的: 转换流是将字节流和字符流相互转换的一个过程,将字节流转换为字符流是为了提高执行效率,反之是为了增加字符流的使用范围。 转化流使用如下:(关键代码) try { //将读取b.txt中的文件并且转换为utf-8格式 打印输出到控制台 isr1 = new InputStreamReader(new FileInputStream(new File("b.txt")),"utf-8"); osw1 = new OutputStreamWriter(new FileOutputStream(new File("c.txt")), "gbk");
char[] chars = new char[10]; int num = 0; while((num = isr1.read(chars)) != -1){ //转换成utf-8之后打印到控制台 //System.out.println(chars); //以GBk的格式写入到c.txt osw1.write(chars, 0, num); } } |
三、标准输入输出以及重定向错误流
作用: 标准输入流(System)是为了读取控制台用户输入内容,标准输出流可以将内容从控制台输出,输出流又叫打印流(PrintWriter),可以打印将内容打印到文件,或者将内容打印到控制台,具体可以通过构造方法实现控制如下:
具体使用如下:(关键代码): try { // 可以将内容写入到 文件中 PrintWriter writer = new PrintWriter(new File("a.txt")); writer.write("哈哈哈哈哈"); writer.println("heheheh"); writer.append("xixixi"); writer.flush(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 可以将内容写到控制台上 PrintWriter writer2 = new PrintWriter(System.out); writer2.write("哈哈哈哈哈"); writer2.println("heheheh"); writer2.append("xixixi"); writer2.flush(); }
重定向错误流: 重定向错误流重定方向标准输入输出流到文件,可以定向到任意文件 使用如下:(关键代码) FileInputStream fis; try { fis = new FileInputStream("a.txt"); System.setIn(fis);// 重新定向 标准输入流 // 重定向需要放在 标准输入流之前 InputStream is = System.in; byte[] b = new byte[80]; int count = is.read(b); System.out.println(new String(b,0,count)); // 标准输出流的重定向 PrintStream ps = new PrintStream("d.txt"); System.setOut(ps);// 标准输出流的重定向 PrintStream ps2 = System.out; ps2.print("阴天下雨了"); ps2.flush(); // 标准错误流的重定向 System.setErr(ps); PrintStream ps3 = System.err; ps3.print("过了会天晴了"); ps3.flush(); } |
四、内存流
内存流作用: 运行在内存中的流执行效率高,跟其他流不同的是,内存流是以内存为参照物,写入内存使用:ByteArrayOutputStream对象,读取文件使用ByteArrayInputStream对象使用如下:
使用如下:(关键代码) ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { // 向内存中写入内容 baos.write("呵呵呵呵".getBytes()); baos.flush(); // toByteArray() 将流中的内容 转成byte数组 byte[] b= baos.toByteArray(); // 创建 内存输入流 ByteArrayInputStream bais = new ByteArrayInputStream(b); byte[] b2 = new byte[50]; int count = bais.read(b2); System.out.println(new String(b2,0,count)); } 各个方法: ByteArrayOutputStream
注:writeTo FileInputStream fis = null; ByteArrayOutputStream baos = null; try { fis = new FileInputStream(new File("a.txt")); baos = new ByteArrayOutputStream();
byte[] bs = new byte[10]; int count = 0; while((count= fis.read(bs))!=-1){ // 写到内存 baos.write(bs, 0, count); baos.flush(); }
// 将内存中数据写到本地文件中 // writeTo 等同于 上个类中自己写的 writeFile baos.writeTo(new FileOutputStream(new File("w.txt"))); } ByteArrayInputStream
|
五、装饰着模式
概念:在原有基础上增加新的功能而不改变原有的方法,增加功能,提高效率,比如子类继承父类的方法,重写父类方法时不改变父类的方法,在原有方法上则增加一些功能。