接續上次串流的部分...
一、串流的串接
二、IO處理
三、New IO處理
四、walkFileTree 與 FileVisitor 拜訪檔案
一、串流的串接
1.資料轉換
InputStreamReader
OutputStreamWriter
2.加快串流處理
BufferedReader
BufferedWriter
♠從檔案a1.txt輸入資料到螢幕(位元組串流的串接)
a1.txt → FileInputStream → InputStreamReader → BufferedReader → String
♠從檔案a1.txt輸入資料到螢幕(字元組串流的串接)
a1.txt → FileReader → BufferedReader → String
♠從螢幕輸出資料到檔案a1.txt(字元組串流的串接)
String → BufferedWriter → FileWriter → a1.txt
♠從螢幕輸出資料到檔案a1.txt(位元組串流的串接)
String → BufferedWriter → OutputStreamWriter → FileOutputStream → a1.txt
二、IO處理
利用主程式的字串陣列 String[] arg 輸入圖片位置檔名 與 輸出位置檔名 來做拷貝的動作。
FileInputStream 取得欲複製的圖片
FileOutputStream 輸出圖片
♠6.0版本後,有個Console類別可以控制輸出輸入
♠4.0版本前的寫法
♠永續化Persistence
利用Serializable介面完成物件的序列化,此介面不須實作任何方法,由 JVM 完成。
物件序列化這個在C++時代就有被討論的議題,Java於1.1以後提供一個介面Serializable實作此序列化機制。所謂序列化,就是能將記憶體(Memory)中的實體物件(Object Instance)以位元流(byte stream)方式儲存於永久媒體如硬碟,此過程叫序列化。而且之後也能從硬碟中再讀取該物件於記憶體中重建,並回復先前狀態。
1.只有非靜態的屬性變數才能序列化。
非靜態方法、靜態屬性變數、靜態方法都不能被序列化。
2.串流的物件也不能被序列化。
3.- transient
此為Java保留字,告訴JVM以transient宣告的基本型態(primitive type)或物件
(object)變數不要序列化,例如敏感性資料像是密碼等,或是在其他環境不
可獲得的資源如JDBC及Network Socket等。總之只要基本型態或物件以
transient宣告,JVM就不會將它序列化。
4.如果類別有繼承關係,欲序列化子類別時,其父類別也要實作(implements) Serializable介面。
5.序列化失敗 會產生 NotSerializableException
6.如果有宣告SerialVersionUID(存取修飾子一定是private static long)的話,在反序列化時會去檢核。反序列化失敗 會產生InvalidClassException。
使用ObjectOutputStream來獲得欲序列化的物件
再交由FileOutputStream存成二進位檔案(其附檔名可以自己隨便命名)
讀出被序列化物件的檔案
(反序列化)
三、New IO處理
使用Path類別中的Paths.get()方法來製造一個路徑物件。
♠新IO ─ 測試Path方法
getFileName():取得檔案名稱
getParent():父層路徑
getNameCount():資料夾階層數
getRoot():所在磁區(根路徑)
toAbsolutePath():取得絕對路徑
isAbsolute():是否為絕對路徑
toUri():取得URL路徑
normalize():路徑正常化
subpath(x,y):取得子路徑x到y-1層
例如:C:\\test1\\aa\\a1.txt → 第1層test1;第2層aa;第3層a1.txt 以此類推
resolve("a1.txt"):在某個路徑後面接上給予的路徑a1.txt
relativize(path):切換路徑到path
♠建立捷徑有兩種
Hard Link:將捷徑直接指向原始檔案的地址。
Soft Link(Symbolic Link): 將捷徑指向原始檔案的名字。連結檔案名字。
但在Windows上已往只能做出Soft Link(Symbolic Link)的效果,在某個版本後可以做出Hard Link。不過,使用JAVA語言還是不能在Windows上建立Soft Link(Symbolic Link)。
♠新IO ─ 測試 Files方法
exists(path):是否存在
notExists(path):是否不存在
size(path):大小
isReadable(path):是否可讀
isWritable(path):是否可寫
isExecutable(path):是否可執行
isHidden(path):是否隱藏
isDirectory(path):是否資料夾
isRegularFile(path):是否一般檔案
getLastModifiedTime(path):取得最後修改時間
createFile(path):建立檔案
createDirectory(path):建立單層資料夾
createDirectories(path):建立多層資料夾
♠新IO檔案刪除
Files.deleteIfExists(path) 不會拋出例外。
Files.delete(path) 會拋出例外,所以必須處理例外。
♠新IO檔案拷貝
Files.copy(Path source, Path target, CopyOption... options)
其中CopyOption實作兩個類別
LinkOption:NOFOLLOW_LINKS(Do not follow symbolic links.)
StandardCopyOption:REPLACE_EXISTING(Replace an existing file if it exists.)
♠新IO檔案 移動 與 拷貝串流
♠新IO 檔案搜尋
利用資料夾串流物件 DirectoryStream<T> ,來做檔案搜尋
♠新IO ─
Files.write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
上方Iterable是Collection的父親。
Files.readAllBytes(Path path)
Files.readAllLines(Path path, Charset cs)
♠新IO ─
Files.newBufferedWriter(Path path, Charset cs, OpenOption... options)
Files.newBufferedReader(Path path, Charset cs)
♠新IO ─
Files.newOutputStream(Path path, OpenOption... options)
Files.newInputStream(Path path, OpenOption... options)
♠新IO ─ 設定Dos檔案屬性
isSystem():是否系統檔
isReadOnly():是否唯讀
isHidden():是否隱藏
isArchive():是否能封存
creationTime():檔案建立時間
lastAccessTime():最後讀取時間
lastModifiedTime():最後修改時間
四、walkFileTree 與 FileVisitor 拜訪檔案
♠實作FileVisitor<T> 將拜訪到的檔案列出檔案路徑
傳回值為FileVisitResult,其Enum Constant有四種
1.CONTINUE
2.SKIP_SIBLINGS(Continue without visiting the siblings of this file or directory.)
3.SKIP_SUBTREE(Continue without visiting the entries in this directory.)
4.TERMINATE
Files.walkFileTree(Path start, FileVisitor<? super Path> visitor)
♠實作FileVisitor<T> 將拜訪到的檔案刪除
♠使用 繼承 SimpleFileVisitor<T> 將拜訪到的檔案列出檔案路徑
此類別已經實作完FileVisitor<T>,實作內容只有return FileVisitResult.CONTINUE;
♠使用 繼承 SimpleFileVisitor<T> 搜尋被拜訪的檔案資料
後記:
1.IO處理第一次接觸,感覺有點多樣化。
2.下次課程要講資料庫! 超期待資料庫的~
3.今早8點半到彰化市區,居然讓我停到一個路邊停車格(不收費),超幸運的~
沒有留言:
張貼留言