Java - I/O
File類
- ?java.io
操作文件和目錄,與平臺無關(guān)。具體的常用實例方法:
File file = new File("."); // 以當(dāng)前路徑創(chuàng)建名為 "." 的 File 對象? · ? 文件目錄信息函數(shù)
? ? - ? String getName/Path/Parent(): 文件名/路徑/父目錄
? ? - ? boolean renameTo(File newName):文件/目錄重命名
? ? - ? long length():文件內(nèi)容長度
? ? - ? long lastModified():文件最后編輯時間
? · ? 文件檢測函數(shù)
? ? - ? boolean exists():判斷文件/目錄是否存在
? ? - ? boolean isFile/isDirectory():判斷是否為文件/目錄
? ? - ? boolean canRead/Write():是否可讀/寫
? ? - ? boolean isAbsolute():文件/目錄是否絕對路徑
? · ? 文件目錄操作函數(shù)
? ? - ? boolean creatNewFile():新建 File 對象對應(yīng)的文件
? ? - ? boolean mkdir():創(chuàng)建 File 對象對應(yīng)的目錄
? ? - ? boolean delete():刪除文件/目錄
? ? - ? void deleteOnExit():JVM 退出時,刪除文件/目錄
? ? - ? String[] list():返回 File 對象的所有子文件名和路徑名
? ? - ? File[] listFiles():返回 File 對象的所有子文件和路徑
? · ? 文件過濾器
利用File類的String[] list(FilenameFilter filter)方法,過濾得到指定類型的文件/目錄,必須重寫accept方法。具體應(yīng)用步驟:
? ζ ? 實現(xiàn)FilenameFilter接口;
? ζ ? 實現(xiàn)boolean accept(File dir, String name)方法;
由于FilenameFilter是函數(shù)式接口,Lambda表達(dá)式可直接作為入?yún)ⅰ?/span>
?參考 :FilenameFilter 介紹;
? · ? RandomAccessFile類
? Java輸入-輸出體系中功能最豐富的文件內(nèi)容訪問類(局限性是只能讀寫文件,不能讀寫IO流),提供"隨機(jī)訪問"方式,支持追加文件內(nèi)容、自由定義記錄指針位置:
? - ?long getFilePointer():返回文件記錄指針當(dāng)前位置;
? - ?void seek(long pos):文件記錄指針定位到pos處;
注意,定點插入數(shù)據(jù)需要先緩存插入點之后的數(shù)據(jù),然后追加新數(shù)據(jù),最后還原緩存的數(shù)據(jù)。RandomAccessFile類可以實現(xiàn)多線程斷點下載/傳輸工具。
Files類
- ?java.io.file
File類的工具類,高度封裝,支持文件復(fù)制、讀寫文件、遍歷文件和子目錄,Java-8支持Stream API操作文件目錄和文件內(nèi)容。
?·???文件復(fù)制
Files.copy(Path source, Path target, CopyOption options); // 文件到文件 Files.copy(InputStream in, Path target, CopyOption options); // 輸入流到文件 Files.copy(Path source, OutputStream out); // 文件到輸出流?·?? 讀寫文件
Files.write(Path src, List<string> strList); // 將字符串內(nèi)容寫入文件 Files.list(Path path); // 列出path目錄下的所有文件和子目錄 Files.lines(Path src); // 列出文件中所有行?·?? 遍歷文件和目錄
// 遍歷startPath路徑下所有文件和子目錄,并會“觸發(fā)”FileVisitor中的相應(yīng)方法 Files.walkFileTree(Path startPath, FileVisitor<? super Path> visitor); Files.walkFileTree(Path startPath, Set<File VisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);I/O 流
流(stream)是從起源(source)到接收(sink)的有序數(shù)據(jù),允許Java程序以相同的方式訪問不同的輸入/輸出源。Java通過裝飾器模式將底層節(jié)點流(低級流)封裝成上層處理流(高級流),統(tǒng)一對不同數(shù)據(jù)源的訪問,靈活方便、執(zhí)行效率高。利用文件過濾器和I/O流可以實現(xiàn)文件的條件復(fù)制。流模型的功能體現(xiàn):
? · 性能提高:以增加緩沖的方式提高I/O效率;
? · 操作便捷:提供不同的流處理方法,靈活性;
Java-I/O的4個抽象基類:
? · ? 輸入流: InputStream,字節(jié)流 - Reader,字符流,
??ζ ?int read():讀取單字節(jié)/單字符,返回int型字節(jié)/字符數(shù)據(jù);
??ζ ?int read(byte/char[] b): 字節(jié)/字符數(shù)組;
??ζ ?int read(byte/char[] b, int pos, int len):字節(jié)/字符數(shù)組;
? · ? 輸出流:OutputStream,字節(jié)流 - Writer,字符流
??ζ ?void write(int v):將字節(jié)/字符數(shù)據(jù)v寫入到輸出流中;
??ζ ?int write(byte/char[] b)-(String str):字節(jié)/字符數(shù)組 - 字符串;
??ζ ?int write(byte/char[] b, int pos, int len)-(String str, int pos, int len):字節(jié)/字符數(shù)組 - 字符串;
字節(jié)流比字符流適應(yīng)范圍廣,但字符流操作方便,文本文件推薦字符流,二進(jìn)制文件推薦字節(jié)流。流的處理依靠隱式的記錄指針:
?? ζ ?void mark(int pos):標(biāo)記記錄指針當(dāng)前位置;
?? ζ ?void reset():記錄指針復(fù)位;
?? ζ ?long skip(long n):記錄指針前移n個字節(jié)/字符;
節(jié)點流直接以物理IO節(jié)點為構(gòu)造器參數(shù),處理流以已存在的流為構(gòu)造器參數(shù)。System.out是輸出處理流PrintStream的實例,System.in是輸入節(jié)點流InputStream的實例。
? ? 其他的流
? [1].轉(zhuǎn)換流:InputStreamReader/OutputStreamWriter
處理流,將字節(jié)流單向轉(zhuǎn)換為字符流。
? [2].推回輸入流:PushbackInputStream/Reader
處理流,利用推回緩沖區(qū),其方法unread()可以重復(fù)讀取剛剛讀取的內(nèi)容。
? [3].緩沖流:BufferedInput/OutputStream-BufferedReader/Writer
處理流,結(jié)合flush()方法實現(xiàn)緩沖功能。其方法readLine()用于讀取行。
? [4].對象流:ObjectInput/OutputStream
處理流,實現(xiàn)對象的序列化。
? [5].管道流:PipedInput/OutputStream-PipedReader/Writer
節(jié)點流,實現(xiàn)進(jìn)程間通信。
其他的如處理文件、數(shù)組、字符串的流均為節(jié)點流。
? ? 標(biāo)準(zhǔn)流重定向:將System.in/out重定向到相應(yīng)位置;
? ?static void setIn/Out/Err(InputStream in/PrintStream out/PrintStream err);
?此外,Runtime.getRuntime().exec("文件名")啟動子進(jìn)程,JVM可以利用返回的Process對象讀寫子進(jìn)程的數(shù)據(jù)。
參考:Java - IO整理
對象序列化機(jī)制
允許把內(nèi)存中的Java對象(對象的類名、實例變量)轉(zhuǎn)換為平臺無關(guān)的二進(jìn)制字節(jié)流(序列化,Serialize),用于永久保存對象到磁盤或利用套接字/RMI傳輸對象,后續(xù)可以恢復(fù)出Java對象(反序列化,Deserialize)。其中,反序列化讀取的是類對象的數(shù)據(jù)而不是類本身,必須提供該對象的class文件。對象序列化機(jī)制是Java提供分布式網(wǎng)絡(luò)編程的基礎(chǔ),也是Java EE的基礎(chǔ)。
對象支持序列化,其類必須是可序列化的,即必須實現(xiàn)接口之一:
·?Serializable:標(biāo)記聲明性接口,常用;
·?Externalizable:用于完全自定義序列化機(jī)制,性能略優(yōu)但編程復(fù)雜度高;
Java序列化機(jī)制采用對對象序列化編號的方法避免同一對象重復(fù)序列化,此方法中要注意可變對象。
? · ? 自定義序列化機(jī)制
?自定義序列化控制程序如何序列化實例變量,重寫如下方法:
·? private void writeObject(ObjectOutputStream out):寫入特定類的實例狀態(tài);
·? private void readObject(ObjectInputStream in):從流中讀取并恢復(fù)對象的實例變量;
·? private void readObjectNoData():可以正確初始化反序列化的對象;
關(guān)鍵字transient用于修飾實例變量,序列化對象時忽略之,static變量也不會序列化,但是可以通過重寫writeObject()和readObject()手動序列化保存。
?自定義序列化機(jī)制可以加密提供安全性:
·? private Object writeReplace()
序列化對象objA時將對象objA替換成其他對象objB,然后調(diào)用writeObject()方法序列化對象objB,可繼承;
·? private Object readResolve()
實現(xiàn)保護(hù)性復(fù)制整個對象,在readObject()之后調(diào)用,返回值會代替readObject()反序列化出來的對象以保證反序列化的正確性,常用于單例類、枚舉類的序列化,可繼承;
? · ? 完全自定義序列化機(jī)制
允許完全由程序員自主決定存儲和恢復(fù)對象數(shù)據(jù),必須實現(xiàn)接口Externalizable和如下方法:
·? public void writeExternal(ObjectOutput out):保存對象的狀態(tài);
·? public void readExternal(ObjectInput in):實現(xiàn)對象反序列化;
方法實現(xiàn)體中,調(diào)用DataIn/Output(ObjectIn/Output的父接口)的方法保存/恢復(fù)基本類型的實例變量,調(diào)用ObjectIn/Output的read/writeObject()方法保存/恢復(fù)引用類型的實例變量。
? · ? 序列化機(jī)制版本
Java序列化機(jī)制允許為序列化類提供private static final long serialVersionUID標(biāo)識Java類的序列化版本,保證序列化版本的兼容性、有利于程序在不同JVM間的可移植性。
參考:
- Java對象序列化; 理解Java對象序列化; JAVA序列化機(jī)制;序列化介紹;
- Java序列化格式詳解;?
NIO
Java的NIO參見:Java - NIO - sqh;
轉(zhuǎn)載于:https://www.cnblogs.com/wjcx-sqh/p/5929874.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java - I/O的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光大小Q卡蓝色星空属于金卡吗?了解清楚对
- 下一篇: Java 并发---Concurrent