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