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(OutputStream out)方法内置自动刷新功能写入读取文件更加方便使用如下:

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

 

 

 

五、装饰着模式

概念:在原有基础上增加新的功能而不改变原有的方法,增加功能,提高效率,比如子类继承父类的方法,重写父类方法时不改变父类的方法,在原有方法上则增加一些功能。

posted @ 2017-04-24 20:40  java李  阅读(615)  评论(0编辑  收藏  举报