From Gossip@Openhome

Java Gossip: DataInputStream、DataOutputStream

DataInputStream、DataOutputStream可提供一些對Java基本資料型態寫入的方法,像是讀寫int、double、 boolean等的方法,由於Java的資料型態大小是規定好的,在寫入或讀出這些基本資料型態時,就不用擔心不同平台間資料大小不同的問題。

這邊還是舉檔案存取來進行說明,有時候您只是要儲存一個物件的成員資料,而不是整個物件的資訊,成員資料的型態假設都是Java的基本資料型態,您不必要 使用Object輸入、輸出相關串流物件,而可以使用DataInputStream、DataOutputStream來寫入或讀出資料,下面這個程式 是個簡單的示範:

  • Student.java
package onlyfun.caterpillar;

public class Student {
private String name;
private int score;

public Student() {
name = "N/A";
}

public Student(String name, int score) {
this.name = name;
this.score = score;
}

public void setName(String name) {
this.name = name;
}

public void setScore(int score) {
this.score = score;
}

public String getName() {
return name;
}

public int getScore() {
return score;
}

public void showData() {
System.out.println("name: " + name);
System.out.println("score: " + score);
}
}

  • DataStreamDemo.java
package onlyfun.caterpillar;

import java.io.*;

public class DataStreamDemo {
public static void main(String[] args) {
Student[] students = {new Student("Justin", 90),
new Student("momor", 95),
new Student("Bush", 88)};
try {
DataOutputStream dataOutputStream =
new DataOutputStream(
new FileOutputStream("data.dat"));

for(Student student : students) {
dataOutputStream.writeUTF(student.getName());
dataOutputStream.writeInt(student.getScore());
}
dataOutputStream.flush();
dataOutputStream.close();

DataInputStream dataInputStream =
new DataInputStream(
new FileInputStream("data.dat"));

for(int i = 0; i < students.length; i++) {
String name = dataInputStream.readUTF();
int score = dataInputStream.readInt();
students[i] = new Student(name, score);
students[i].showData();
}
dataInputStream.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}

這個程式在寫入檔案時,只提取物件的成員資料,而在讀出時將這些資料讀出,並將讀回的資料設定給一個實例,是物件資料還原的一種方式。