DataInputStream和DataOutputStream
java.io.DataInputStream和java.io.DataOutputStream可提供一些对Java基本数据类型写入的方法,像读写int、double和boolean等的方法。由于Java的数据类型大小是规定好的,在写入或读出这些基本数据类型时,就不用担心不同平台间数据大小不同的问题。
这里还是以文件存取来进行说明。有时只是要存储一个对象的成员数据,而不是整个对象的信息,成员数据的类型假设都是Java的基本数据类型,这样的需求不必要使用到与Object输入、输出相关的流对象,可以使用DataInputStream、DataOutputStream来写入或读出数据。
下面使用范例来介绍如何使用DataInputStream与DataOutputStream。先设计一个Member类。
范例14.7 Member.java
package onlyfun.caterpillar; public class Member { private String name; private int age;
public Member() { }
public Member(String name, int age) { this.name = name; this.age = age; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
public String getName() { return name; }
public int getAge() { return age; } }
打算将Member类实例的成员数据写入文件中,并打算在读入文件数据后,将这些数据还原为Member对象。范例14.8简单示范了如何实现这个需求。
范例14.8 DataStreamDemo.java
package onlyfun.caterpillar; import java.io.*; public class DataStreamDemo { public static void main(String[] args) { Member[] members = {new Member("Justin", 90), new Member("momor", 95), new Member("Bush", 88)}; try { DataOutputStream dataOutputStream = new DataOutputStream( new FileOutputStream(args[0])); for(Member member : members) { // 写入UTF字符串 dataOutputStream.writeUTF(member.getName()); // 写入int数据 dataOutputStream.writeInt(member.getAge()); } // 读出所有数据至目的地 dataOutputStream.flush(); // 关闭流 dataOutputStream.close(); DataInputStream dataInputStream = new DataInputStream( new FileInputStream(args[0])); // 读出数据并还原为对象 for(int i = 0; i < members.length; i++) { // 读出UTF字符串 String name = dataInputStream.readUTF(); // 读出int数据 int score = dataInputStream.readInt(); members[i] = new Member(name, score); } // 关闭流 dataInputStream.close();
// 显示还原后的数据 for(Member member : members) { System.out.printf("%s\t%d%n", member.getName(), member.getAge()); } } catch(IOException e) { e.printStackTrace(); } } }
在从文件中读出数据时,不用费心地自行判断读入字符串时或读入int类型时何时该停止,使用对应的readUTF()或readInt()方法就可以正确地读入完整类型数据。同样地,DataInputStream、DataOutputStream并没有改变InputStream或OutputStream的行为,读入或写出时的动作还是InputStream、OutputStream负责。DataInputStream、DataOutputStream只是在实现对应的方法时,动态地为它们加上类型判断功能,在这里虽然是以文件存取流为例,实际上可以在其他流对象上也使用DataInputStream、DataOutputStream功能 。
转载自:http://book.51cto.com/art/200812/101116.htm