Java IO類庫之ObjectInputStream和ObjectOutPutStream

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

一、ObjectOutputStream

1 - ObjectOuputStream介紹

? ? ObjectOutputStream(對象字節輸出流),用于將一個序列化對象寫入到創建ObjectOutputStream時傳入的底層字節輸入流中,通過源碼可知該類繼承OutputStream的同時實現了ObjectOutput接口,而此接口繼承了DataOut接口,因此ObjectOutputStream在具有DataOutputStream寫入基礎數據類型到底層字節流功能的同時也具有將對象、數組和字符串寫入到底層字節輸入流中的功能。

ObjectOutputStream與DataOutputStream的區別:

1)ObjectOutputStream是將一個對象的所有屬性、還有類信息的額外信息寫入到底層字節輸出流中,而DataOutputStream一次寫入的只是一個基礎類型數據

2)讀取時ObjectOutputStream一次只讀取一個對象不關心每個對象屬性的寫入順序,DataOutputStream需要嚴格按照寫入順序進行讀取

2 - ObjectOutputSteam源碼解析

1)常用成員方法

protected  void annotateClass(Class<!--?--> cl);        子類可以實現此方法,從而允許在流中存儲類數據。protected  void annotateProxyClass(Class<!--?--> cl);   子類可以實現此方法,從而在流中存儲定制數據和動態代理類的描述符。 void close();//關閉當前流、釋放所有與此流有關的資源。 void defaultWriteObject();//將表示當前類狀態的屬性寫入到構造時傳入的底層流out中。 protected  void drain();//將ObjectOutputStream中的所有已緩沖數據寫入到底層流中、注意:但是不flush底層流、 protected  boolean enableReplaceObject(boolean enable);//允許流對流中的對象進行替換。 void flush();//刷新該流的緩沖、這里也會將底層流中的數據flush到底層流指定的目的地中。 ObjectOutputStream.PutField putFields();//獲取用于緩沖寫入流中的持久存儲字段的對象。 protected  Object replaceObject(Object obj);//在序列化期間,此方法允許 ObjectOutputStream 的受信任子類使用一個對象替代另一個對象。 void reset();//重置將丟棄已寫入流中的所有對象的狀態。 void write(byte[] buf);//寫入一個 byte 數組。 void write(byte[] buf, int off, int len);//寫入字節的子數組。 void write(int val);//寫入一個字節。 void writeBoolean(boolean val);//寫入一個 boolean 值。 void writeByte(int val);//寫入一個 8 位字節。 void writeBytes(String str);//以字節序列形式寫入一個 String。 void writeChar(int val);//寫入一個 16 位的 char 值。 void writeChars(String str);//以 char 序列形式寫入一個 String。 protected  void writeClassDescriptor(ObjectStreamClass desc);//將指定的類描述符寫入ObjectOutputStream。 void writeDouble(double val); //寫入一個 64 位的 double 值。 void writeFields();//將已緩沖的字段寫入流中。 void writeFloat(float val);//寫入一個 32 位的 float 值。 void writeInt(int val);//寫入一個 32 位的 int 值。 void writeLong(long val);//寫入一個 64 位的 long 值。 void writeObject(Object obj);//將指定的對象寫入 ObjectOutputStream。 protected  void writeObjectOverride(Object obj); //子類用于重寫默認 writeObject 方法的方法。 void writeShort(int val);//寫入一個 16 位的 short 值。 protected  void writeStreamHeader();//提供 writeStreamHeader 方法,這樣子類可以將其自身的頭部添加或預加到流中。 void writeUnshared(Object obj);//將“未共享”對象寫入 ObjectOutputStream。 void writeUTF(String str);//以 UTF-8 修改版格式寫入此 String 的基本數據。 

二、ObjectInputStream

1 - ObjectInputStream介紹

? ? ObjectInputStream是對象字節輸入流,繼承自InputStream,用于從底層字節輸入流中讀取一個序列化對象到程序中,與ObjectOutputStream功能相對應,實現了ObjectInput接口,而ObjectInput實現了DataInput接口,在實現DataInput接口定義的基礎類型數據的基礎上擴展了讀取對象、數組和字符串的功能。它可以和FileInputStream和FileOutStream將使用ObjectOutputStream持久化的對象、數組和字符串讀取到程序中,并還原狀態,當然還可以用于在網絡中傳輸對象數據。

2 - ObjectInputStream源碼分析

1)構造方法

    public ObjectInputStream(InputStream in) throws IOException {verifySubclass();bin = new BlockDataInputStream(in);handles = new HandleTable(10);vlist = new ValidationList();serialFilter = ObjectInputFilter.Config.getSerialFilter();enableOverride = false;readStreamHeader();bin.setBlockDataMode(true);}protected ObjectInputStream() throws IOException, SecurityException {SecurityManager sm = System.getSecurityManager();if (sm != null) {sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);}bin = null;handles = null;vlist = null;serialFilter = ObjectInputFilter.Config.getSerialFilter();enableOverride = true;}

兩個構造方法邏輯基本相同,不同點在于ObjectInputStream是創建一個全新的字節流,而ObjectInputStream(InputStream in)的部分屬性基于綁定的字節輸入流in

2)其他常用成員方法

int available(); //返回不受阻塞地讀取的字節數
void close();//關閉輸入流
void defaultReadObject();//從當前輸入流讀取當前類狀態的屬性(沒有被static、transient修飾的字段)
protected boolean enabledResolveObject(boolean enable);//使流允許從該流讀取的對象被替換
int read();//讀取字節數據
int read(byte[] buf, int off, int len);//讀入byte數組
boolean readBoolean();//讀取一個boolean值
byte readByte();//讀取一個8位字節
char readChar();//讀取一個16位char值
...
String readUTF();//讀取UTF-8格式的String
readFully(byte buf[])
readFully(byte buf[],int off,int len);//阻塞直至讀取所有字節
ObjectInputStream.GetField readFields();//按名稱從流中讀取持久字段并使其可用

?

轉載于:https://my.oschina.net/zhangyq1991/blog/1860710

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451141.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是覆蓋索引?如何利用覆蓋索引進行SQL語句優化?

如果你不知道什么是覆蓋索引&#xff0c;那么SQL性能優化便無從談起&#xff01; 什么是覆蓋索引?如何利用索引進行SQL語句優化&#xff1f; 表結構 150多萬的數據&#xff0c;這么一個簡單的語句&#xff1a; 慢查詢日志里居然很多用了1秒的&#xff0c;Explain的結果是&am…

ARM的商業模式是如何煉成的?

導讀&#xff1a;保守、嚴謹&#xff0c;又有一些皇族氣質&#xff0c;作為一家擁有純正英國血統的公司&#xff0c;ARM看似呆板的作風卻讓其在移動互聯網大潮中勢如破竹&#xff0c;沒有對手。也許過于看重產業鏈伙伴的聲音&#xff0c;導致ARM的決策有些遲緩&#xff0c;比如…

java 將一段時間分割為兩個連續的時間

eg: 20180901 -- 20180930 ->>>> 20180901-20180915 && 20180916-20180930 /*** 獲取兩日期相差天數** param beginDateStr 時間起點* param endDateStr 時間終點* param TimeType 時間類型 yyyy-MM-dd || yyyyMMdd || ....* return long /天數*/public …

java 中 FtpClient 實現 FTP 文件上傳、下載

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 源代碼大部分是網上找的&#xff0c;查來查去&#xff0c;找到幾個可以用的例子&#xff0c;改來改去&#xff0c;揉合成現在這個樣子。…

MongDB集合文檔操作符

一、MongoDB - 連接1.啟動 MongoDB 服務只需要在 MongoDB 安裝目錄的 bin 目錄下執行 mongod 即可執行啟動操作后&#xff0c;mongodb 在輸出一些必要信息后不會輸出任何信息&#xff0c;之后就等待連接的建立&#xff0c;當連接被建立后&#xff0c;就會開始打印日志信息。可以…

LIMIT M,N分頁性能優化方案

利用子查詢優化 說明: MySQL 并不是跳過 offset 行&#xff0c;而是取 offsetN 行&#xff0c;然后返回放棄前 offset 行&#xff0c;返回 N 行&#xff0c;那當 offset 特別大的時候&#xff0c;此時使用limit m,n效率就非常的低下。想要提升性能要么控制返回的總頁數&#…

PHP獲取文件后綴名

PHP獲取文件后綴名是PHP學習者常見的一種操作&#xff0c;無論是在面試過程中還是PHP新手自學中。PHP獲取文件后綴名都是很普遍的需要掌握的一個知識點。下面我們就給大家總結介紹PHP獲取文件擴展名也就是后綴名的兩種方法&#xff01;一、通過pathinfo首先大家應該知道pathinf…

Web Service 簡單實例(java 版本) ,IDE自動生成客戶端代碼方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、客戶端工程 jar 包 &#xff1a; 二、1. 服務端&#xff1a;( new 一個web service project ) package com;import javax.jws.…

最佳Linux服務器發行版

一款Linux發行版就如同一件衣服一樣&#xff0c;適合自己的才是最好的選擇。 對大型企業而言&#xff0c;當然首選Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。Red Hat有完善的技術支持服務&#xff0c;而且在我們周圍&#xff0c;非常容易找到持有Red Hat認證的技…

在線代碼編輯器 Codemirror 的輕量級 React 組件

代碼編輯器 CodeMirror 的輕量級 React 組件 demo uiw-react.github.io/react-codem… 特性: ? 自動根據 mode 配置加載 mode 文件。 ? 快速簡單的配置 API。 安裝 npm install uiw/react-codemirror --save 復制代碼使用 import CodeMirror from uiw/react-codemirror; impo…

「機械」4大傳動方式優劣對比:機械、電氣、氣壓、液壓

傳動方式有很多種。目前應用比較多的四大類傳動方式&#xff08;機械、電氣、液壓和氣壓&#xff09;中&#xff0c;沒有一種動力傳動是十全十美的。今天跟大家分享4種傳動方式的優劣對比。 一. 機械傳動 1. 齒輪傳動 齒輪傳動是機械傳動中應用最廣的一種傳動形式。它的傳動比較…

一次性獲取多個oracle序列的值,實現關聯表多數據的批量insert

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 業務 要求批量導入不小于10W條數據到 user 表&#xff0c;但是user表在 insert 每條數據的同時要 insert 一條對應數據到 customer表…

開始使用C++11的9個理由

如果你的代碼工作正常并且表現良好&#xff0c;你可能會想知道為什么還要使用C 11。當然了&#xff0c;使用用最新的技術感覺很好&#xff0c;但是事實上它是否值得呢&#xff1f; 在我看來&#xff0c;答案毫無疑問是肯定的。我在下面給出了9個理由&#xff0c;它們分為兩類&a…

MySQL批量update數據(更新的數據值不同)

(一)純mysql: ?UPDATE my_table SETstatus CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title CASE idWHEN 1 THEN New Title 1WHEN 2 THEN New Title 2WHEN 3 THEN New Title 3END WHERE id IN (1,2,3) (二)mybatis寫法 1:foreach <update id"batchUpd…

webpack+vue-cli 中proxyTable配置接口地址代理

在項目開發的時候&#xff0c;接口聯調的時候一般都是同域名下&#xff0c;且不存在跨域的情況下進行接口聯調&#xff0c;但是當我們現在使用vue-cli進行項目打包的時候&#xff0c;我們在本地啟動服務器后&#xff0c;比如本地開發服務下是 http://localhost:8080 這樣的訪問…

AMQP 協議介紹

RabbitMQ 是遵從AMQP 協議的&#xff0c; 換句話說&#xff0c; RabbitMQ 就是AMQP 協議的Erlang 的實現(當然RabbitMQ 還支持STOMP2 、MQTT3 等協議) 0 AMQP 的模型架構和RabbitMQ 的模型架構是一樣的&#xff0c;生產者將消息發送給交換器&#xff0c;交換器和隊列綁定。當生…

關聯表多數據的批量insert (批量導入,測試19W條數據用時46秒)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、業務需求 &#xff1a;作多個批量導入 &#xff0c;根據業務不同&#xff0c;每條數據導入前作各種驗證&#xff0c; 導入后提示驗證…

Java已死?九百萬程序員說不

Java沒死&#xff0c;事實上它擁有足夠的能量讓你的應用跑起來。那些對Java吹毛求疵人頻繁地聚焦在一些小眾問題上&#xff0c;總是和其他技術或者語言做些不公平的對比&#xff0c;這些語言并沒有像Java一樣得到廣泛應用及長遠的歷史。 現在的小孩都能學Java&#xff0c;它在…

Linux SSH遠程管理故障如何排查?

SSH遠程管理故障排查方案&#xff1a;1、檢測兩個機器是否暢通兩個機器之間是否暢通&#xff0c;查看物理鏈路是否有問題(網線網卡、IP是否正確)第1步&#xff1a;物理鏈路是否暢通&#xff0c;比喻為“高速公路是否暢通”ping 排查客戶端到服務端的線路問題&#xff0c;ping是…