1. 程式人生 > >ObjectOutputStream以追加方式寫入檔案

ObjectOutputStream以追加方式寫入檔案

    不知道大家有沒有遇到這樣的異常  java.io.StreamCorruptedException: invalid type code: AC ,我在用ObjectOutputStream以追加的方式往檔案裡面寫入,在寫入時開啟一個流,用writeObject()寫入物件後關閉流,然後又開啟流,再追加寫入物件。這樣在用ObjectInputStream讀取物件時,就會報這個異常,第一個物件是可以正常讀出來,第二各物件就報異常了。原因是在新建一個ObjectOutputStream物件時會首先在寫入兩個Short型別的資料,就是四個位元組,可以去看看ObjectOutputStream的構造方法,裡面呼叫了一個writeStreamHeader()方法,在這個方法中寫入了兩個Short型別的頭部資料。所以要解決這個問題就有兩個辦法:

1、在用readObject()讀物件的時候,先去掉4個位元組的頭部。

public static void main(String[] args) throws Exception {
		File file =new File("/home/zhang/test/test.txt");
			FileOutputStream fos = new FileOutputStream(file,true);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(new User("aaa","123")); //寫入第一個物件
			oos.close();//關閉流
			
			FileOutputStream fos1 = new FileOutputStream(file,true);
			ObjectOutputStream oos1 = new ObjectOutputStream(fos1);
			oos1.writeObject(new User("bbb","123"));//寫入第二個物件
			oos1.close();
			
			FileInputStream fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			User user=(User)ois.readObject();
			System.out.println(user.toString());//讀取第一個物件
			
			byte[] buf =new byte[4];
			fis.read(buf);
			user=(User)ois.readObject();   //讀取第二個物件
			System.out.println(user.toString());
	}
這樣在讀第二個物件是時就不會丟擲異常了。

2、重寫ObjectOutputStream 的  writeStreamHeader()方法。自定義追加寫入物件的類

public class AppendObjectOutputStream extends ObjectOutputStream {

	public static  File file = null;   //總覺的在這裡把這個file定義成公有靜態不好,
	                                    //但是這個變數必須在構造之前被初始化。只好這麼辦了
	
	public AppendObjectOutputStream(File file) throws IOException {
		super(new FileOutputStream(file,true));
	}
	public void writeStreamHeader() throws IOException {
				
		System.out.println("重寫的方法執行了");
		if (file != null) {
			System.out.println("file.length()="+file.length());
			if (file.length() == 0) {
			System.out.println("檔案存在但為空!!!");
				super.writeStreamHeader();
			} else {
				System.out.println("檔案不為空");  //當檔案不為空時,空實現
			}
		} else {
			System.out.println("檔案不存在");
			super.writeStreamHeader();
		}
	}
}


public static void main(String[] args) throws Exception {
		File file =new File("/home/zhang/test/test.txt");
		    AppendObjectOutputStream.file = file;  //必須先給file賦值,不然後面重寫的方法裡的判斷都不會進入了
		    AppendObjectOutputStream aoos = new AppendObjectOutputStream(file);
			aoos.writeObject(new User("aaa","123")); //寫入第一個物件
			aoos.close();//關閉流
			
			AppendObjectOutputStream aoos1 = new AppendObjectOutputStream(file);
			aoos1.writeObject(new User("bbb","123"));//寫入第二個物件
			aoos1.close();
			
			FileInputStream fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			User user=(User)ois.readObject();
			System.out.println(user.toString());//讀取第一個物件
			user=(User)ois.readObject();   //讀取第二個物件
			System.out.println(user.toString());
	}




相關推薦

ObjectOutputStream追加方式寫入檔案

    不知道大家有沒有遇到這樣的異常  java.io.StreamCorruptedException: invalid type code: AC ,我在用ObjectOutputStream以追加的方式往檔案裡面寫入,在寫入時開啟一個流,用writeObject()

PHP追加方式寫入檔案 file_put_content

PHP file_put_contents() 函式是一次性向檔案寫入字串或追加字串內容的最合適選擇。 file_put_contents() file_put_contents() 函式用於把字串寫入檔案,成功返回寫入到檔案內資料的位元組數,失敗則返回 FALSE

c語言 將記憶體中資料二進位制形式寫入檔案 檔案中的資料表現形式

最近有在寫關於將記憶體中的資料寫入檔案的程式,當程式執行後,卻發現檔案中的位元組資料有些難以理解。思考後發現了其中的道理。 程式碼如下: #include<stdio.h> #include<stdlib.h> struct BlockInfo { bool is

r+方式fopen檔案,寫不進去內容

        例如下面這段程式碼: #include<stdio.h> int main(void) { FILE* file = fopen("test.txt", "r+"); char str[

android 追加形式寫檔案並把檔案儲存到SD卡中

android手機記憶體本來就不大,要是老把資料放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把資料要放到SD卡中,以減少手機記憶體的使用,本文僅寫入檔案,不對讀檔案進行說明。好,go! 第一步:新建android專案,命名為Test next ->

javascriptpost方式實現檔案的匯出或下載

當用GET方式來實現檔案(excel、pdf、doc)匯出或下載的時候,傳參比較簡單直接放到url裡面,常用的匯出方法有:1>window.open(url引數),來實現檔案的匯出。2>動態新增a標籤,<a target="_blank" href="url

將需要書寫的內容,追加方式寫到檔案

public void writeScriptLog(String writeInfo,Boolean isError) { File folder =new File("目錄"); try { if (!folder.exists()) { folder.mkdirs(

將圖片檔案流的方式寫入到jsp頁面

     最近專案中要求提供一個servlet供使用者訪問,用來將使用者照片直接顯示在網頁上,這個和驗證碼有點類似,只是圖片內容來自於檔案,沒什麼新東西,現在將部分關鍵實現程式碼貼在下面,以備參考。     response.setContentType("image/jpeg");      //設定返回

將圖片檔案二進位制方式儲存和恢復

/** * 將圖片轉換成二進位制 * * @return */ static String getImageBinary() { BASE64Encoder encoder = new sun.misc.BASE64Encoder(); //本地圖片 Fil

java讀取檔案寫入檔案方式(位元組流和字元流)

java讀取檔案和寫入檔案的方式 以位元組為單位讀取檔案 一次讀一個位元組 一次讀多個位元組 以字元為單位讀取檔案 一次讀一個字元 一次讀多個字元 以位元組為單位讀取檔案 以位元

C# 寫入檔案的幾種方式

1. FileStream.Write string filePath = Directory.GetCurrentDirectory() + "\\" + Process.GetCurrentProcess().ProcessName + ".txt"; if (File.Exist

實戰:如何不同的方式讀取檔案

作為圖形作業系統,Fedora 的使用是令人愉快的。你可以輕鬆地點選完成任何任務。但你可能已經看到了,在底層還有一個強大的命令列。想要在 shell 下體驗,只需要在 Fedora 系統中開啟你的終端應用。這篇文章是向你展示常見的命令列使用方法的系列文章之一。 在這部分

Flutter 如何二進位制的方式儲存檔案

本文將介紹如何將二進位制檔案儲存至指定路徑,已經通過測試,測試的過程為使用下文的方式將sqlite資料庫儲存至專案資料夾內,可以正常的通過sqflite使用 //flutter資源路徑,需要提前配置好,保證可用,路徑的最後要標註檔名與字尾,例如file.db String

使用spark將資料bulkload的方式寫入Hbase時報錯

Exception in thread "main" java.io.IOException: Trying to load more than 32 hfiles to one family of one region 從報錯日誌中可以很明顯看出因為Hfiles的個數超出了32預設的時32

位元組流接受鍵盤輸入後寫入檔案,並緩衝位元組流複製檔案

一、程式碼及解釋 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.File

js構建form表單 post方式提交 一般用於匯出檔案

 js構建form表單  以post方式提交   一般用於匯出檔案 傳遞引數: var parms = {   "key1":"value1",   "key1":"value2" } /**  * 構建form表單,以post方式提交  * @param actio

POST流的方式傳送檔案

public static void postUpload(String json, String pwd,String targetFile) throws Exception{ HttpClient httpclient = new DefaultHttpClient

linux使用者分組的方式檔案許可權管理例項

1.在做檔案許可權管理之前,我們先了解下檔案的基本屬性,執行 ll 或者ls -l,檢視檔案的基本屬性,以及所屬的使用者和組: 第一列中: 第一個字元: d:表示目錄; -:表示檔案; rwx: r:讀許可權 w:寫許可權 x:執行許可權 三個為一組,沒有該許可權時,用

FastDFS的配置、部署與API使用解讀(2)位元組方式上傳檔案的客戶端程式碼

本文來自 詩商·柳驚鴻 Poechant CSDN部落格,轉載請註明源地址:FastDFS的配置、部署與API使用解讀(2)上傳檔案到FastDFS分散式檔案系統的客戶端程式碼 在閱讀本文之前,請您先通過《FastDFS的配置、部署與API使用解讀(1)Get Start

C#連線access資料庫,無法啟動應用程式。工作組資訊檔案丟失,或是已被其它使用者獨佔方式開啟。

最近有個任務,寫一個程式,讀取使用者電腦上另外一個公司的mdb資料庫記錄,然後上傳到自己公司的網站。 算是第一次正式做C#專案,遇到了不少問題,第一個就是連線access資料庫的問題: OleDbException: 無法啟動應用程式。工作組資訊檔案丟失,或是已被其它使用者