【Java】IO——File、字節流與字符流、內存流、打印流、輸入流與輸出流、序列化與反序列化

目錄

IO

一、File文件操作類—既可以描述具體文件也可以描述文件夾

二、字節流與字符流

三、文件拷貝

四、字符編碼

五、內存流(以內存爲終端的輸入輸出流)

六、打印流(輸出流的強化版本)

七、System類對IO的支持

八、兩種輸入流

九、序列化


IO

核心掌握五個類(File、OutputStream、InputStream、Reader、Writer)一個接口(Serializable)

一、File文件操作類—既可以描述具體文件也可以描述文件夾

File類是唯一一個與文件本身操作(創建、刪除、取得信息)有關的程序類

產生File對象:

public File(String pathname);//根據文件絕對路徑產生

public File(URI uri):根據網絡產生File對象

1.常用操作方法:

創建新文件:public boolean create NewFile() throws IOException.

判斷文件是否存在:public boolean exists().

刪除文件:public boolean delete().

文件分隔符:File.separator.

2.目錄操作

取得文件路徑的File對象:public File getParentFile()

取得文件路徑:public String getParent()

創建多級文件路徑(一次性創建多級不存在的文件路徑):public boolean mkdirs().

3.取得文件路徑信息

判斷File對象是否是文件:public boolean isFile().

判斷File對象是否是文件夾:public boolean isDirectory().

取得文件大小:public long length() ——字節爲單位

取得上次修改時間 :public long lastModified().

列出一個目錄的全部組成:public file[ ] listFiles().

二、字節流與字符流

Java.io包中流分爲兩大類:輸入流與輸出流

字節流:InputStream.OutputStream(byte)

字符流:Reader、Writer(char)

流模型的操作流程:

a.取得終端對象

b.根據終端對象取得輸入輸出流

c.根據輸入輸出流進行數據讀取和寫入

d.關閉流網絡

IO操作屬於資源操作,所有資源操作(IO操作、數據庫操作,網絡)最後必須要進行關閉

1.字節輸出流OutputStream

public abstract class OutputStream implements Closeable.Flushable OutputStream 

//實現了這兩個接口,這兩個接口中的方法:

關閉流方法:close( )

刷新緩衝區:flush( )

核心方法:

write(byte b[ ]):將給定字節數組全部輸出

write(byte b[ ],int off,int len):將給定字節數從 off 開始輸出len長度

write(int b):輸出單個字節

使用OutputStream輸出數據時,若指定文件不存在,FileOutputStream會自動創建文件(不包含創建目錄),使用FileOutPutStream輸出內容時,默認爲文件內容的覆蓋,若要進行文件內容追加,使用如下構造:

public FileOutputStream(File  file,boolean append)

JDK1.7追加了Auto Closeable自動關閉接口,要使用此接口,必須使用try-catch塊

2.字節輸入流InputStream

public abstract class InputStream implements Closeable.

public int read(byte b[ ]) throws IOException.

將讀取的內容放入字節數組中,

返回值有如下三種情況:

a.返回b.length//未讀取數據>存放的緩存區大小

b.返回>0的整數(小於b.length)  //未讀數據<緩存區大小,返回剩餘數據大小

c.返回-1//此時數據讀完

3.字節輸出流writer

public abstract class writer implements Appendable.Closeable.Flushable

public void writer(String str) throws IOException.

字符流可以直接支持字符串的輸出

[未關閉流,數據在緩存區存放,不會輸出到目標終端,要想輸出,要麼關閉流,要麼使用flush]

4.字符輸入流Reder

public int read(char cbuf[ ]) throws IOException.

5.轉換流(字節流—>字符流)

OutputStreamWriter(字節輸出流->字符輸出流)

InputStreamReader(字節輸入流->字符輸入流)

字符流的具體子類大都是通過轉換流將字節流轉換爲字符流(Filewriter繼承轉換流)

三、文件拷貝

四、字符編碼

五、內存流(以內存爲終端的輸入輸出流)

字節內存流ByteArrayInputStream.ByteArrayOutputStream

字符內存流charArrayReader、char ArrayWriter

public ByteArrayInputStream(byte buf[ ])將指定的字符數組內容存放到public Byte ArrayOutputStream( )

六、打印流(輸出流的強化版本)

字節打印流:PrintStream

字符打印流:PrintWriter

打印流的設計屬於裝飾設計模式——基於抽象類

特點:核心依然是某個類(OutputStream提供的writer())的功能,但是爲了得到更好的操作效果,讓其支持的功能更多一些,

使用裝飾類(PrintStream)

優點:很容易更換裝飾類來達到不同的操作效果

缺點:造成類結構複雜

七、System類對IO的支持

標準輸出(顯示屏)Stystem.out

標準輸入(鍵盤)System.in

錯誤輸出 System.err

1.系統輸出:系統提供的out.err對象均是printStream的對象

2.系統輸入:System.in是InputStream的直接對象

八、兩種輸入流

1.Buffered Reder類 Buffered InputStream

String readLine()直接讀取一行輸入,默認以回車換行

2.Java.util.Scanner類——支持正則表達式

hasNext+ ..():判斷是否有指定類型數據輸入

next ..():取得指定類型數據

use Delimiter("指定分割符")

九、序列化

1.概念:將內存中保存的對象變爲二進制流進行輸出或保存在文本中,將文本變爲二進制流

要想讓類支持序列化,必須實現Serializable接口,Serializable接口爲標識接口,只有實現了Serializable接口的類才具備對象序列化的功能。

2.序列化與反序列化

用到IO包中提供的兩個處理類:

ObjectOutputStream ——序列化

—write Object(Object obj):將Obj變爲二進制流輸出到目標終端

Object InputStream ——反序列化

—read Object (Object:將二進制流反序列化爲對象)

3.transient關鍵字

若希望類中若干屬性不被序列化,可以在屬性前添加transient關鍵字

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章