ObjectInputStream和ObjectOutputStream

ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输入流。
ObjectInputStream与ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入。
一个可以被序列化的MyClass类的定义:
public class MyClass implements Serializable{
  public transient Thread t;
  private String customerID;
  private int total;
}

编程举例:创建了一个可序列化的学生对象,并用ObjectOutputStream类把他存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。


import java.io.*;

public class Student implements Serializable {
  int id;
  String name;
  int age;
  String department;
  public Student(int id, String name, int age, String department){
    this.id = id;
    this.name = name;
    this.age = age;
    this.department = department;
  } 
}

import java.io.*;

public class Serialization {
  public static void main(String [] args) throws Exception {
    Student stu1 = new Student(19, "zhangsan", 25, "huaxue");
    Student stu1 = new Student(20, "lisi", 23, "wuli");

    FileOutputStream fos = new FileOutputStream("student.txt");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(stu1);
    oos.writeObject(stu2);
    oos.close();

    FileInputStream fin = new FileInputStream("student.txt");
    ObjectInputStream ois = new ObjectInputStream(fin);
    stu1 = (Student)ois.readObject();
    stu2 = (Student)ois.readObject();
    ois.close();

    System.out.println("id:" + stu1.id);
    System.out.println("name:" + stu1.name);
    System.out.println("age:" + stu1.age);
    System.out.println("department:" + stu1.department);

    System.out.println("id:" + stu2.id);
    System.out.println("name:" + stu2.name);
    System.out.println("age:" + stu2.age);
    System.out.println("department:" + stu2.department);
  }
}


字节流与字符流的转换:
  能不能找到一种简单的方式来读取键盘上输入的一行字符,如何找?
  InputStreamReader和OutputStreamWriter,是用于将字节流转换成字符流来读写的两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
  InputStreamReader的两个主要的构造函数:
    -InputStreamReader(InputStream in)
    -InputStreamReader(InputStream in, String CharsetName)
  OutputStreamWriter的两个主要的构造函数:
    -OutputStreamWriter(OutputStream in)
    -OutputStreamWriter(OutputStream in, String CharsetName)
  避免频繁地在字符与字节间进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类来读写数据,应尽量使用BufferedWriter类包装OutputStreamWriter类,用BufferedReader类包装InputStreamReader。


java程序与其他进程的数据通信:
  在java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
  调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。
  编程实例:在TestInOut类中启动java.exe命令执行另外一个MyTest类,TestInOut和MyTest通过进程间的管道相互传递数据。

import java.io.*;

public class TestInOut implements Runnable {
  Process p = null;
 
  public TestInOut(){
    try{
      p = Runtime.getRuntime().exec("java MyTest");
      //这里的new TestInOut()不能这么写,很危险,可能产生无限递归。
      //而且process的对象也不是一个,用this表达。
      //new Thread(new TestInOut()).start();
      new Thread(this).start();
    }catch(Exception e){
      e.printStackTrace();
    }
  }

  public static void main(String[] args){
    TestInOut tio = new TestInOut();
    tio.send();
   
  }

  public void send(){
    try{
      OutputStream ops = p.getOutputStream();
      while(true){
        ops.write("help/r/n".getBytes());
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }

  public void run(){
    try{
      InputStream ips = p.getInputStream();  
      BufferedReader bfr = new BufferedReader(new InputStreamReader(in));
      while(true){
        String strLine = bfr.readLine();
        System.out.println(strLine);
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

public class MyTest{
  public static void main(String[] args) throws Exception {
    while(true){
      System.out.println("hi:" +
      new BufferedReader(new InputStreamReader(System.in)).readLine());
    }
  }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值