1. 程式人生 > >Java中物件輸出流問題

Java中物件輸出流問題

物件輸出流問題:

怎樣能連續向檔案中新增物件,並且可以從檔案中迴圈讀取出物件?

錯誤的情況:連續多次呼叫oos.writeObject(user)向檔案中寫入物件,然後這樣while((user=(User)ois.readObject())!=null)迴圈取出物件

出現這種情況的解釋:ObjectOutputStream建立後第一次寫入一個物件時, 會在物件資料前寫入一些標誌的資料“ACED0005”。當你關閉ObjectOutputStream後再重新開啟往檔案裡面寫物件時(append方式),就會再一次把“ACED0005”寫入檔案,而這些資訊並不是你寫入物件的資料,所以當你用ObjectInputStream來讀取物件時,流會將除第一個“ACED0005”以外的資料當作各個物件的資料,造成無法解析,所以讀取時有一個java.io.StreamCorruptedException異常出現:java.io.StreamCorruptedException: invalid type code: AC

解決辦法:那個“AC ED 00 05”是ObjectOutputStream.writeSystemHeader()寫進去的,你可以繼承ObjectOutputStream類,覆蓋這個方法。在你自己的writeSystemHeader()裡判斷是不是第一次寫入一個檔案,如果是向一個檔案大小不為零的檔案追加的話,就呼叫super.reset(),如果是第一次寫這個檔案,不是追加,就呼叫super.writeSystemHeader()

自定義類MyObjectOutputStream:

public classMyObjectOutputStream extends ObjectOutputStream {

         //定義成靜態的好處 

    private static File f; 

    /*

     * 初始化靜態檔案物件,並返回類物件

     * @param file 檔案物件,用於初始化靜態檔案物件

     * @param out 輸出流

     */ 

    public static  MyObjectOutputStream newInstance(File file,OutputStream out)throws IOException { 

        f= file;//本方法最重要的地方:構建檔案物件,是兩個檔案物件屬於同一個 

        return new MyObjectOutputStream(out,f); 

    } 

    @Override 

    protected void writeStreamHeader() throwsIOException { 

        if (!f.exists() || (f.exists()&& f.length() == 0)) { 

            super.writeStreamHeader(); 

        } else { 

            super.reset(); 

        } 

    } 

    public MyObjectOutputStream(OutputStreamout, File f) throws IOException { 

        super(out); 

    } 

}

測試方法:

         public static void WriteNode(FileNodenode){

                   try {

                            File file = newFile("F:\\Tree.txt");

                            FileOutputStreamfout = new FileOutputStream(file, true);

                            //使用自定義ObjectOutputStream,解決追加寫入後,讀取錯誤的問題

                            MyObjectOutputStreamoos = MyObjectOutputStream.newInstance(file, fout);

                            oos.writeObject(node);

                            oos.close();

                   }catch (Exception e) {

                            e.printStackTrace();

                   }

         }

通過上面的處理辦法向檔案中寫入資料,當再用while((user=(User)ois.readObject())!=null)迴圈取物件時就不會丟擲java.io.StreamCorruptedException: invalid type code: AC異常了。

第一種:

新增多個物件:可以將要新增的物件封裝到集合中去,比如List,然後將list物件寫入檔案oos.writeObject(list)。

要注意new FileOutputStream(file, true);  //true表示要在檔案內容後面追加內容,不會造成覆蓋問題。

讀取物件:可以取出List<User> list =(List<User>)ois.readObject(),然後用Iterator迭代List集合取出所有物件。

相關推薦

Java物件輸出問題

物件輸出流問題: 怎樣能連續向檔案中新增物件,並且可以從檔案中迴圈讀取出物件? 錯誤的情況:連續多次呼叫oos.writeObject(user)向檔案中寫入物件,然後這樣while((user=(User)ois.readObject())!=null)迴圈取出物件。 出

java輸入輸出的知識總結 以及小例子程式

處理流(包在其他管道上的管道) 緩衝流: BufferedReader(Reader in) BufferedReader(Reader in,int sz)//sz為自定義緩衝區的大小 BufferedWriter(Writer out) BufferedInputStr

java使用輸出下載檔案彈出開啟儲存框

response.reset(); // 必要地清除response中的快取資訊 response.setHeader("Content-Disposition", "attachment; filename=" + file); response.setContentType("application/vn

Java物件使用的一個注意事項

再寫jsp的實驗作業的時候,需要用到java中物件流,但是碰到了之前沒有遇到過的情況,改bug改到崩潰!!記錄下來供大家分享 如果要用物件流去讀取一個檔案,一定要先判斷這個檔案的內容是否為空,如果為空的話,就是連物件流的例項物件也不要建立,一建立就會報錯。 錯誤程式碼例項: public stat

java輸入輸出詳細講解(入門經典),詳細講解JAVA的IO

今天我們開始進入學習 java 中比較讓人頭疼的事, 那就是 I/O 流、多執行緒、網路程式設計。這裡對 I/O 流的一個詳細講解。希望對大家有點用吧。(不看後悔哦) 一、什麼是IO Java中I/O操作主要是指使用Java進行輸入,輸出操作。 Java所有的I/O機制都是基於資料流進行輸入

Java的輸入輸出

ace adl import package 特定 文件流 flush print 技術 一、流的概念 在Java中,流是從源到目的地的字節的有序序列。Java中有兩種基本的流——輸入流(InputStream)和輸出流(OutputStream)。 根據流相對

理解Java字符與字節流的區別

png 技術 print 復制代碼 bar 顯式 數字 length ava 1. 什麽是流 Java中的流是對字節序列的抽象,我們可以想象有一個水管,只不過現在流動在水管中的不再是水,而是字節序列。和水流一樣,Java中的流也具有一個“流動的方向”,通常可以從中讀

java重定向輸出實現程序日誌

java重定向public class RedirectOutputStream { public static void main(String[] args) {try {PrintStream out = System.out; //保存原輸出流PrintSt

java IO輸入輸出實現文本復制

輸入輸出 bsp ava 技術 輸出流 png nbsp log ima java IO輸入輸出流實現文本復制

Java的IO總結

繼承 input buffer static tput class [] 總結 寫入 Java中的IO流總結 1. 流的繼承關系,以及字節流和字符流。 2. 節點流FileOutputStream和FileInputStream和處理流BufferedInputStream

JAVA常用IO類:FileInputStream和FileOutputStream

table string [] 文件中 讀取 描述符 off fis 系統資源 FileInputStream 用於讀取本地文件中的字節數據,繼承自InputStream類 構造方法摘要 FileInputStream(File file) 通

Java利用IO的輸入讀取文件實現登錄功能

use 判斷 body 當前 ole pwd files pre users 1 package object.io; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundEx

Java的輸入輸出

ava hello 寫入 數組長度 byte[] txt 數據讀取 抽象 清空 概述:   java中的io流主劃分輸入流和輸出流;其中又各自分有字節流和字符流;兩者的差別主要是在於讀入/寫出的單位大小不同;由於java采用的是GBK編碼格式,因而一個字符占用2個字節,即字

Java的IO

dex pen 標準 args all uname 文件清空 bsp 如果 Java中的IO流 根據流的方向分為 輸入流和輸出流 根據讀取文字的大小 字節流和字符流 字節流按字節讀取 讀取中文時容易亂碼 字符流按字符讀取 通常用於讀取中文 根據

Java字符與字節流的區別

重載方法 二進制 抽象類 相同 緩沖區 pre pub 不支持 之間 1. 什麽是流 Java中的流是對字節序列的抽象,我們可以想象有一個水管,只不過現在流動在水管中的不再是水,而是字節序列。和水流一樣,Java中的流也具有一個“流動的方向”,通常可以從中讀入一個字

java物件物件引用的區別

1.何謂物件?   在Java中有一句比較流行的話,叫做“萬物皆物件”,這是Java語言設計之初的理念之一。要理解什麼是物件,需要跟類一起結合起來理解。下面這段話引自《Java程式設計思想》中的一段原話:   “按照通俗的說法,每個物件都是某個類(class)的一個例項(instance),這裡,‘

JavaIO各種的先後關閉順序

Java中IO各種流的先後關閉順序 2017年06月06日 15:43:49 馬大頭 閱讀數:3858更多 個人分類: I/OJava 還是先看API   void close()   

Java物件的this引用

        Java提供了一個this關鍵字,this關鍵字總是指向呼叫該方法的物件。根據this出現位置的不同,this作為物件的預設引用有兩種情形。 -構造器中引用該構造器正在初始化的物件 -在方法中引用呼叫該方法的物件   &n

Java物件的初始化過程詳解

在Java中,我們需要對物件進行初始化操作。 經常需要new 物件。但是new物件時到底發生了什麼呢? 有時候我們不是特別清晰。 所以今天又重新學習了一下JavaSE部分,又有了新的感受。 在此記錄一下 首先程式碼部分 Person類: class Person{

Java物件和json互相轉換的工具類

package com.Dingyu.util; import java.util.List; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaT