2015年3月29日 星期日

JAVA7-課程14

        接續上次串流的部分...
        一、串流的串接
        二、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點半到彰化市區,居然讓我停到一個路邊停車格(不收費),超幸運的~

沒有留言:

張貼留言