Java淺談流之對象流ObjectInputStream和ObjectOutputStream

    我們知道Java中對文件操作有6種流:

             1 文件字節流:這是InputStream和OutputStream的子類 eg: FileInputStream  FileOutputStream

             2 文件字符流    這是Reader和Writer的其子類  eg:FileReader    FileWriter    

             3 緩衝流   BufferReader類創建的對象稱爲緩衝輸入流,該輸入流的指向必須是一個Reader流,稱爲BufferReader的底層流,底層流負責將數據讀入到緩衝區,BufferReader流的源就是這個緩衝區,緩衝輸入流再從緩衝區讀取數據;同樣的, BufferWriter類創建的對象稱爲緩衝輸出流,該輸入流的指向必須是一個Writer流,稱爲BufferWriter的底層流,BufferWriter流負責將數據寫入到緩衝區,底層流的源就是這個緩衝區,底層流再從緩衝區寫入數據到目的地

            4 數據流    DataInputStream和DataOutputStream創建的對象稱爲數據輸入流和數據輸出流,這兩個流允許程序按照與機器無關的風格讀取Java原始數據。也就是說我們讀取一個數值時候,不必關心這個數值應當是多少字節。

            5 對象流    ObjectInputStream和ObjectOutputStream類分別是InputStream和OutputStream的子類。ObjectInputStream和ObjectOutputStream創建的對象稱爲對象輸入流和對象輸出流,對象輸出流使用WriteObject(Object obj)方法將一個對象Obj寫入輸出流送往目的地,對象輸入流則使用readObject()方法從源中讀取一個對象到程序中。下面我着重講解對象流

         當我們使用對象流寫入或者讀取對象時,要保證對象是序列化的,這是爲了保證能把對象寫入到文件,並且從文件中正確讀取到程序中。一個類如果實現了Serializable接口,那麼這個類創建的對象就是序列化的對象,Serializable接口中的方法對程序是不可見的,因此實現該接口的類不需要實現額外的方法,當把一個序列化的對象寫入到對象輸出流的時候,JVM會自動的實現Serializable接口中的方法,按照一定格式的文本將對象寫入到目的地。

       但是我們應該明確,對象流寫入到文件是以16進制保存的,因此使用普通的編輯器打開(word,記事本)會亂碼,對象流本來就是適合網絡之間的傳輸。

      另外我們必須要明確是:使用readObject()只能從文件中讀取一個一次,不能像BufferReader的readLine()方法一樣可以循環控制中讀取輸入,也就是說如果文件中存在多個對象,那麼只是讀取第一個對象,例如:

package inputoutputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

 class TV implements Serializable{
	private int price;
	private double weigth;
	private String describe;
	private boolean isNice;
	 List<List<String>> list;
	
	public TV(){
		list=new ArrayList<>();
		for(int i=0;i<10;i++)
			list.add(new ArrayList<String>());
	}
	public List<List<String>> getList() {
		return list;
	}
	public void setList(List<List<String>> list) {
		this.list = list;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
public double getWeigth() {
		return weigth;
	}
	public void setWeigth(double weigth) {
		this.weigth = weigth;
	}
	public String getDescribe() {
		return describe;
	}
	public void setDescribe(String describe) {
		this.describe = describe;
	}
	public boolean isNice() {
		return isNice;
	}
	public void setNice(boolean isNice) {
		this.isNice = isNice;
	}
	
}
public class ObjectStream {

	private TV t;
	private final static String OUTPUT="C:\\Users\\samsung\\Desktop\\weiwei.txt";
	
	public ObjectStream(){
		t=new TV();
		t.setNice(true);
		t.setDescribe("very nice~~");
		t.setPrice(800);
		t.setWeigth(200.23);
		for(int i=0;i<10;i++){
			for(int j=0;j<4;j++)
				t.list.get(i).add("["+(i+3)+","+j+"]");
		}
	}
	public void write(TV tv) throws FileNotFoundException, IOException{
		File file=new File(OUTPUT);
		/*TV []data=new TV[2];
		data[0]=tv;data[1]=tv;*/
		ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file,false));
		//objectOutputStream.writeObject(data);
		objectOutputStream.writeObject(tv);
		objectOutputStream.close();
		System.out.println("write over~!~~");
	}
	
	public void read(TV tv) throws FileNotFoundException, IOException, ClassNotFoundException{
		File file=new File(OUTPUT);
		ObjectInputStream inputStream =new ObjectInputStream(new FileInputStream(file));
		TV v=(TV) inputStream.readObject();
		//List<TV> s=new ArrayList<>();
		//TV vv[]= (TV[]) inputStream.readObject();
		//TV []vv=(TV[])inputStream.readObject();
		//for(TV v:vv){
			System.out.println(v.getDescribe());
			System.out.println(v.getPrice());
			System.out.println(v.isNice());
			System.out.println(v.getWeigth());
			System.out.println(v.getList());
		//}
	}
	
	public void writeChar() throws Exception{
		String output="C:\\Users\\samsung\\Desktop\\ww.txt";
		String s="上來的飛機上開發是卡洛斯的房間裏誰";
		File file=new File(output);
		FileOutputStream stream=new FileOutputStream(file);
		stream.write(s.getBytes());
		stream.close();
	}
	
	public void readChar()throws Exception{
		String output="C:\\Users\\samsung\\Desktop\\ww.txt";
		File file=new File(output);
		FileInputStream stream=new FileInputStream(file);
		byte b[]=new byte[200];
		while(stream.read(b, 0, 200)!=-1){
			String string=new String(b);
			System.out.println(string);
		}
		stream.close();
	}
	
	public static void main(String[] args) throws Exception {
		ObjectStream stream=new ObjectStream();
		stream.write(stream.t);
		stream.read(stream.t);
		/*stream.writeChar();
		stream.readChar();*/
	}
	
	
}

但是當我們想要存放多個對象到某一個文件中並且想要讀取的時候把所有的對象都讀取出來,那麼我們必須使用一種數據結構把這些對象存入,比喻list或者直接使用數組,並且必須保證存入時的數據結構和取出時的數據結構是一樣的,比喻我們使用數組存放了對象,然後使用writerObject方法把這個數組寫入,那麼我們在使用readObject方法讀取數據的時候必須將其返回類型定義爲一個對象數組,例如:注意下面的代碼和上面的代碼的細微變化:

package inputoutputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

 class TV implements Serializable{
	private int price;
	private double weigth;
	private String describe;
	private boolean isNice;
	 List<List<String>> list;
	
	public TV(){
		list=new ArrayList<>();
		for(int i=0;i<10;i++)
			list.add(new ArrayList<String>());
	}
	public List<List<String>> getList() {
		return list;
	}
	public void setList(List<List<String>> list) {
		this.list = list;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
public double getWeigth() {
		return weigth;
	}
	public void setWeigth(double weigth) {
		this.weigth = weigth;
	}
	public String getDescribe() {
		return describe;
	}
	public void setDescribe(String describe) {
		this.describe = describe;
	}
	public boolean isNice() {
		return isNice;
	}
	public void setNice(boolean isNice) {
		this.isNice = isNice;
	}
	
}
public class ObjectStream {

	private TV t;
	private final static String OUTPUT="C:\\Users\\samsung\\Desktop\\weiwei.txt";
	
	public ObjectStream(){
		t=new TV();
		t.setNice(true);
		t.setDescribe("very nice~~");
		t.setPrice(800);
		t.setWeigth(200.23);
		for(int i=0;i<10;i++){
			for(int j=0;j<4;j++)
				t.list.get(i).add("["+(i+3)+","+j+"]");
		}
	}
	public void write(TV tv) throws FileNotFoundException, IOException{
		File file=new File(OUTPUT);
		TV []data=new TV[2];
		data[0]=tv;data[1]=tv;
		ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(file,false));
		objectOutputStream.writeObject(data);
		//objectOutputStream.writeObject(tv);
		objectOutputStream.close();
		System.out.println("write over~!~~");
	}
	
	public void read(TV tv) throws FileNotFoundException, IOException, ClassNotFoundException{
		File file=new File(OUTPUT);
		ObjectInputStream inputStream =new ObjectInputStream(new FileInputStream(file));
		//TV v=(TV) inputStream.readObject();
		//List<TV> s=new ArrayList<>();
		//TV vv[]= (TV[]) inputStream.readObject();
		TV []vv=(TV[])inputStream.readObject();
		for(TV v:vv){
			System.out.println(v.getDescribe());
			System.out.println(v.getPrice());
			System.out.println(v.isNice());
			System.out.println(v.getWeigth());
			System.out.println(v.getList());
		}
	}
	
	public void writeChar() throws Exception{
		String output="C:\\Users\\samsung\\Desktop\\ww.txt";
		String s="上來的飛機上開發是卡洛斯的房間裏誰";
		File file=new File(output);
		FileOutputStream stream=new FileOutputStream(file);
		stream.write(s.getBytes());
		stream.close();
	}
	
	public void readChar()throws Exception{
		String output="C:\\Users\\samsung\\Desktop\\ww.txt";
		File file=new File(output);
		FileInputStream stream=new FileInputStream(file);
		byte b[]=new byte[200];
		while(stream.read(b, 0, 200)!=-1){
			String string=new String(b);
			System.out.println(string);
		}
		stream.close();
	}
	
	public static void main(String[] args) throws Exception {
		ObjectStream stream=new ObjectStream();
		stream.write(stream.t);
		stream.read(stream.t);
		/*stream.writeChar();
		stream.readChar();*/
	}
	
	
}

這裏使用了一個對象數組data將兩個對象存入並且讀出的時候使用了對象數組來接收。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章