目錄
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關鍵字