JAVA中Socket通信是以流的形式传输数据,对于InputStream和OutputStream的装饰问题,如果只是传输一串字符串,可以通过简单的BufferedReader和PrintWriter实现,但是在实际的客户端与服务端通信中不可能只是传递简单字符串,会有各种不同形式的信息,若是传输对象,则可以用 ObjectInputStream和ObjectOutputStream来实现,但是这种方法局限性也很明显,所以需要自己定义通信协议,用到DataInputStream和DataOutputStream。
以下是利用DataInputStream和DataOutputStream实现的将person类实例中的数据在文件中存取的过程,在Socket通信中也类似。
person.class
public class person {private String name;private int age;public person(String name,int age){this.name=name;this.age=age;}public String getName(){return name;}public int getAge(){return age;}}文件存取过程:
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class DataInputstream {public static void main(String[] args) throws IOException {person a=new person("ba1",20);String path="F:/aaa.txt";String name=null;int age=0;File file=new File(path);if(!file.exists())file.createNewFile();FileOutputStream fos=new FileOutputStream(file);DataOutputStream dos=new DataOutputStream(fos);dos.writeByte(0x17);//用byte数据可以表示后面的数据类型,这里代表person类dos.writeChar('/t');//用/t符来分隔不同的数据dos.writeChars(a.getName());dos.writeChar('/t');dos.writeInt(a.getAge());dos.close();fos.close();DataInputStream dis=new DataInputStream(new FileInputStream(file));switch(dis.readByte()){case 0x17:dis.readChar();//跳过分隔符StringBuffer n=new StringBuffer();char c;while((c=dis.readChar())!='/t')//因为readchar方法只能一个一个读,所以要一位一位的加到字符串中n.append(c);name=n.toString();age=dis.readInt();}System.out.println("name is "+name+",age is "+age);dis.close();}}