心得---字节流、文件操作、对象序列化
1. 抽象基類InputStream、OutputStream,不能實(shí)例化。
???????????????????????????????
???????InputStream類是基本的輸入類。它定義了所有輸入流所需的方法。
??????? publicabstract int read() throws IOException
??????? publicint read(byte b[]) throws IOException
???????public int read(byte b[],intoffset,int length) throws IOException
功能為從輸入流中讀數(shù)據(jù)。這一方法有幾種重載形式,可以讀一個(gè)字節(jié)或一組字節(jié)。當(dāng)遇到文件尾時(shí),返回-1。最后一種形式中的offset是指把結(jié)果放在b[]中從第offset個(gè)字節(jié)開始的空間,length為長度。
???????public int available() throwsIOException
輸入流共有多少字節(jié)可讀。注意此方法對(duì)InputStream的各派生類不一定都有效,有時(shí)會(huì)有返回零字節(jié)的錯(cuò)誤結(jié)果。
???????public void close() throwsIOException
關(guān)閉輸入流并釋放資源。雖然java提供垃圾回收機(jī)制,當(dāng)一個(gè)流不再使用時(shí)可以由運(yùn)行系統(tǒng)自動(dòng)關(guān)閉,但為了提高程序的安全性和穩(wěn)定性,建議使用close()關(guān)閉。
???????public boolean markSupperted( )
返回布爾值,說明此流能否做標(biāo)記或復(fù)位。
???????public synchronized void mark(intreadlimit)
為當(dāng)前流做標(biāo)記。其參數(shù)說明在標(biāo)記失效前可以讀多少字節(jié),這個(gè)值通常也就設(shè)定了流的緩沖區(qū)大小。
???????public synchronized void reset()throws IOException
返回到上一次做標(biāo)記處。
???????public long skip (long n) throwsIOEnception
從輸入流跳過幾個(gè)字節(jié)。返回值為實(shí)際跳過的字節(jié)數(shù)
2.??
PublicFileOutputStream(String name)throws FileNotFoundException
PublicFileOutputStream(File file)throws FileNotFoundException
PublicFileOutputStream(String name,Boolean append)throws FileNotFoundException
Name為文件名,file為文件類File對(duì)象,append表示文件是否為添加的寫入方式,append默認(rèn)為false,false時(shí)為重寫方式,即從頭寫入,覆蓋原來文件內(nèi)容。
?寫的方法與讀的一樣。只不過這里用write。
3.
ˉ???字節(jié)流可以操作任何數(shù)據(jù)
ˉ???字符流使用的是字符數(shù)組;字節(jié)流使用的是字節(jié)數(shù)組
4.如果文件體積不是很大,可以這樣操作。
byte[]buf = new byte[fis.available()];//創(chuàng)建一個(gè)剛剛好的緩沖區(qū)。但是這有一個(gè)弊端,就是文件過大,大小超出jvm的內(nèi)容空間時(shí),會(huì)內(nèi)存溢出。
fis.read(buf);
System.out.println(new String(buf));
5.?? 文件類(File)
??????? 一個(gè)File類的對(duì)象,表示磁盤上的文件和目錄。它提供了與平臺(tái)無關(guān)的方法來對(duì)磁盤上的文件或目錄進(jìn)行操作,包括:更改文件名、刪除文件、列出目錄下的文件以及文件對(duì)象屬性的描述信息等。
ü????構(gòu)造方法
?????? public?? File(String?path);
?????? public?? File(String path,String name);
?????? public?? File(File?parent,String chile);
例如:
File f1? = newFile(“data.txt”);
File f2? = newFile(“\\D:”,“data.txt”);
File f3? = newFile(“\\D:”);
File f4? = newFile(f3,“data.txt”);
ü????靜態(tài)常量
? 由于不同操作系統(tǒng)的文件分隔符以及路徑分隔符不同,因此,如果要獲取當(dāng)前系統(tǒng)的文件和路徑的分隔符,可使用以下兩個(gè)靜態(tài)常量。
?????? publicstatic final char separatorChar;
?????? publicstatic final char pathSeparatorChar;
?????? publicstatic final char separator;
ü????其它方法
?(1).訪問文件對(duì)象:
public StringgetName():返回文件對(duì)象名,不包含路徑名
public StringgetPath():返回文件路徑名,包含對(duì)象名
public StringgetAbsolutePath():返回文件絕對(duì)路徑名,包含對(duì)象名
public StringgetParent():返回父文件對(duì)象名的路徑名
public StringgetParentFile():返回父文件對(duì)象
(2)獲得文件屬性
public longlength();
public Booleanexists():測(cè)試指定的文件是否存在
public longlastModified():返回指定文件最后被修改的時(shí)間
(3)文件操作
public booleanrenameTo(Filedest):文件重命名
public booleandelete():刪除空目錄
(4)目錄操作
publicboolean mkdir():創(chuàng)建指定目錄,正常建立時(shí)返回true
publicString[] list():返回目錄中的所有文件名字符串
public FilelistFiles():返回指定目錄中的所有文件對(duì)象
6. 文件的隨機(jī)訪問類??
?對(duì)于InputStream類和OutputStream類來說,它們的實(shí)例都是順序訪問流,訪問從頭至尾順序進(jìn)行,而且輸入流只能讀不能寫,輸出流只能寫不能讀,即對(duì)一個(gè)文件不能同時(shí)進(jìn)行讀寫操作,而RandomAccessFile類提供了另一種稱為“隨機(jī)訪問文件”的方式。它有兩個(gè)特點(diǎn):
?? 對(duì)一個(gè)文件可以同時(shí)進(jìn)行既讀又寫的操作。
?? 可以在文件中指定的任意位置讀取數(shù)據(jù)或?qū)懭霐?shù)據(jù)。
類聲明:
public class PandomAccessFile extends Object implementsDataOutput,DataInput?
??? 他不是流??
?????RandomAccessFile類可以對(duì)文件進(jìn)行隨機(jī)讀寫操作。
ü?????創(chuàng)建一個(gè)RandomAccessFile對(duì)象
???????RandomAccessFile(File file,String mode) ;
???????RandomAccessFile(String name,String mode);
ü????讀寫數(shù)據(jù)的常用方法
??? 讀、寫基本數(shù)據(jù)類型: readInt();writeInt(int n)等;
??? 讀、寫UTF字符串:?readUTF();writeUTF(String str);
??? 讀取文件中的一行: readLine();
ü?????文件隨機(jī)讀寫流的讀取指針控制
long getFilePointer() ---得到當(dāng)前的文件讀取指針。
void seek(long pos) ---把指針從開始移動(dòng)到pos位置。
long length() ---得到文件的長度(有多少個(gè)字節(jié)) 。
void setLength(long newLength)
7.對(duì)象流分為:對(duì)象輸入流ObjectInputStream和對(duì)象輸出流ObjectOutputStream
構(gòu)造方法:
public ObjectInputStream()throws IOExcepetion,SecurityException
public ObjectInputStream(inputStream in)throws IOExcepetion,SecurityException
?? readObject():從ObjectInputStream讀取對(duì)象。
8.序列化(Serialization)是指并行數(shù)據(jù)轉(zhuǎn)換成串行數(shù)據(jù)的處理過程,而對(duì)象序列化(Object Serialization)是指把對(duì)象的狀態(tài)數(shù)據(jù)以字節(jié)流的形式進(jìn)行處理,一般用于實(shí)現(xiàn)完全的對(duì)象。簡(jiǎn)單的說序列化可以理解為使用I/O對(duì)象流類型實(shí)現(xiàn)的對(duì)象讀寫操作。
?? Java.io.ObjectOutputStream的writerObject()方法將內(nèi)存中該對(duì)象的狀態(tài)信息以有序二進(jìn)制流(0、1序列)的形式輸出到目標(biāo)數(shù)據(jù)文件中,實(shí)現(xiàn)了信息的永久保存,這一工程即所謂的對(duì)象序列化。
?? 對(duì)象序列化的主要任務(wù)是寫出對(duì)象的狀態(tài)信息,并遍歷改對(duì)象建立一個(gè)對(duì)其他對(duì)象的引用,遞歸的序列化所有被引用的其他對(duì)象。
?? 注意:并不是任何引用類型的數(shù)據(jù)(對(duì)象)都可以被序列化,只有實(shí)現(xiàn)了java.io.Serializable接口的類的對(duì)象才可以序列化,這主要出于安全性考慮,一些封裝敏感信息或時(shí)效性很強(qiáng)的信息的類則不建議支持序列化,以避免出現(xiàn)泄漏或消息失效問題。在java語言規(guī)范中規(guī)定了Serializable接口的實(shí)現(xiàn)類均應(yīng)該提供無參的構(gòu)造方法,以供可能的反序列化操作,系統(tǒng)重建對(duì)象時(shí)自動(dòng)調(diào)用,不過這一規(guī)則并未得到嚴(yán)格的貫徹。
在對(duì)象序列化的過程中,其所屬類的static屬性和方法代碼是不會(huì)被序列化的,因?yàn)閟tatic屬性為整個(gè)類共有,不應(yīng)因一個(gè)對(duì)象的“沉浮”而受影響,而方法代碼是一成不變的,反序列化時(shí)只要在運(yùn)行環(huán)境中找到一份其所屬的類文件即可(注意必須是當(dāng)初序列化操作時(shí)使用的同一版本.class文件,如果中間進(jìn)行過修改并重新編譯,則反序列化時(shí)會(huì)出錯(cuò))對(duì)于個(gè)別不希望被序列化的非static屬性(實(shí)例變量),也可以在屬性聲明時(shí)使用transient關(guān)鍵字進(jìn)行表明。
?在序列化時(shí)static和transient屬性均被略過,反序列化重構(gòu)對(duì)象時(shí),對(duì)象的這些屬性被默認(rèn)初始化和顯示初始化處理。其中static屬性如果已經(jīng)存在,則維持原狀,不再進(jìn)行初始化處理。
轉(zhuǎn)載于:https://www.cnblogs.com/yangkai-cn/archive/2012/05/15/4017541.html
總結(jié)
以上是生活随笔為你收集整理的心得---字节流、文件操作、对象序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库设计的第三范式
- 下一篇: JDK、TOMCAT、Ant环境变量设置