Java - I/O

File類

  • ?java.io

 操作文件和目錄,與平臺無關。具體的常用實例方法

File file = new File(".");    //  以當前路徑創建名為 "." 的 File 對象

? · ? 文件目錄信息函數
? ? - ? String getName/Path/Parent(): 文件名/路徑/父目錄
? ? - ? boolean renameTo(File newName):文件/目錄重命名
? ? - ? long length():文件內容長度
? ? - ? long lastModified():文件最后編輯時間
? · ? 文件檢測函數
? ? - ? boolean exists():判斷文件/目錄是否存在
? ? - ? boolean isFile/isDirectory():判斷是否為文件/目錄
? ? - ? boolean canRead/Write():是否可讀/寫
? ? - ? boolean isAbsolute():文件/目錄是否絕對路徑
? · ? 文件目錄操作函數
? ? - ? boolean creatNewFile():新建 File 對象對應的文件
? ? - ? boolean mkdir():創建 File 對象對應的目錄
? ? - ? boolean delete():刪除文件/目錄
? ? - ? void deleteOnExit():JVM 退出時,刪除文件/目錄
? ? - ? String[] list():返回 File 對象的所有子文件名和路徑名
? ? - ? File[] listFiles():返回 File 對象的所有子文件和路徑

? · ? 文件過濾器
 利用File類的String[] list(FilenameFilter filter)方法,過濾得到指定類型的文件/目錄,必須重寫accept方法。具體應用步驟
? ζ ? 實現FilenameFilter接口
? ζ ? 實現boolean accept(File dir, String name)方法;  
由于FilenameFilter是函數式接口,Lambda表達式可直接作為入參。
?參考 :FilenameFilter 介紹;

? · ? RandomAccessFile類
 ? Java輸入-輸出體系中功能最豐富的文件內容訪問類(局限性是只能讀寫文件,不能讀寫IO流),提供"隨機訪問"方式,支持追加文件內容、自由定義記錄指針位置:
 ? - ?long getFilePointer():返回文件記錄指針當前位置;
 ? - ?void seek(long pos):文件記錄指針定位到pos處;
注意,定點插入數據需要先緩存插入點之后的數據,然后追加新數據,最后還原緩存的數據。RandomAccessFile類可以實現多線程斷點下載/傳輸工具。

Files類

  • ?java.io.file

 File類的工具類,高度封裝,支持文件復制、讀寫文件、遍歷文件和子目錄,Java-8支持Stream API操作文件目錄和文件內容。

???文件復制

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);  // 將字符串內容寫入文件
Files.list(Path path);  // 列出path目錄下的所有文件和子目錄
Files.lines(Path src);  // 列出文件中所有行

?? 遍歷文件和目錄

// 遍歷startPath路徑下所有文件和子目錄,并會“觸發”FileVisitor中的相應方法
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)的有序數據,允許Java程序以相同的方式訪問不同的輸入/輸出源。Java通過裝飾器模式將底層節點流(低級流)封裝成上層處理流(高級流),統一對不同數據源的訪問,靈活方便、執行效率高。利用文件過濾器和I/O流可以實現文件的條件復制。流模型的功能體現
? · 性能提高:以增加緩沖的方式提高I/O效率
? · 操作便捷:提供不同的流處理方法,靈活性; 
 Java-I/O的4個抽象基類
? · ? 輸入流: InputStream字節流 - Reader字符流,
??ζ ?int read():讀取單字節/單字符,返回int型字節/字符數據;
??ζ ?int read(byte/char[] b): 字節/字符數組;
??ζ ?int read(byte/char[] b, int pos, int len):字節/字符數組;
? · ? 輸出流:OutputStream字節流 - Writer字符流
??ζ ?void write(int v):將字節/字符數據v寫入到輸出流中;
??ζ ?int write(byte/char[] b)-(String str):字節/字符數組 - 字符串;
??ζ ?int write(byte/char[] b, int pos, int len)-(String str, int pos, int len):字節/字符數組 - 字符串;
 字節流比字符流適應范圍廣,但字符流操作方便,文本文件推薦字符流,二進制文件推薦字節流。流的處理依靠隱式的記錄指針
?? ζ ?void mark(int pos):標記記錄指針當前位置;
?? ζ ?void reset():記錄指針復位; 
?? ζ ?long skip(long n):記錄指針前移n個字節/字符;
 節點流直接以物理IO節點為構造器參數,處理流以已存在的流為構造器參數。System.out是輸出處理流PrintStream的實例,System.in是輸入節點流InputStream的實例。
? ? 其他的流
? [1].轉換流InputStreamReader/OutputStreamWriter
   處理流,將字節流單向轉換為字符流。

? [2].推回輸入流PushbackInputStream/Reader
   處理流,利用推回緩沖區,其方法unread()可以重復讀取剛剛讀取的內容。

? [3].緩沖流BufferedInput/OutputStream-BufferedReader/Writer
   處理流,結合flush()方法實現緩沖功能。其方法readLine()用于讀取行。

? [4].對象流ObjectInput/OutputStream
   處理流,實現對象的序列化。

? [5].管道流PipedInput/OutputStream-PipedReader/Writer
   節點流,實現進程間通信。

  其他的如處理文件、數組、字符串的流均為節點流。
? ? 標準流重定向:將System.in/out重定向到相應位置;
? ?static void setIn/Out/Err(InputStream in/PrintStream out/PrintStream err);

?此外,Runtime.getRuntime().exec("文件名")啟動子進程,JVM可以利用返回的Process對象讀寫子進程的數據。

參考:Java - IO整理

對象序列化機制

 允許把內存中的Java對象(對象的類名、實例變量)轉換為平臺無關的二進制字節流(序列化,Serialize),用于永久保存對象到磁盤或利用套接字/RMI傳輸對象,后續可以恢復出Java對象(反序列化,Deserialize)。其中,反序列化讀取的是類對象的數據而不是類本身,必須提供該對象的class文件。對象序列化機制是Java提供分布式網絡編程的基礎,也是Java EE的基礎。
 對象支持序列化,其類必須是可序列化的,即必須實現接口之一:
  ·?Serializable:標記聲明性接口,常用;
  ·?Externalizable:用于完全自定義序列化機制,性能略優但編程復雜度高;

1 public class MyClass implements java.io.Serializable{
2       ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("文件名")); 
3       MyClass objMy = new MyClass();   out.writeObject(objMy);
4       out.close();
5 
6       ObjectInputStream in = new ObjectInputStream(new FileInputStream("文件名"));    
7       MyClass resMy = (MyClass)in.readObject();
8       in.close();
9 }
View Code

 Java序列化機制采用對對象序列化編號的方法避免同一對象重復序列化,此方法中要注意可變對象。
? · ? 自定義序列化機制
 ?自定義序列化控制程序如何序列化實例變量,重寫如下方法:
  ·? private void writeObject(ObjectOutputStream out):寫入特定類的實例狀態;
  ·? private void readObject(ObjectInputStream in):從流中讀取并恢復對象的實例變量;
  ·? private void readObjectNoData():可以正確初始化反序列化的對象;
  關鍵字transient用于修飾實例變量,序列化對象時忽略之,static變量也不會序列化,但是可以通過重寫writeObject()和readObject()手動序列化保存。

 1 @override
 2 private void writeObject(ObjectOutputStream out) throws IOException{
 3       out.defaultWriteObject();
 4       out.writeXxx(基本類型變量)/writeObject(引用類型變量);
 5 }
 6 @override
 7 private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException{
 8       in.defaultReadObject();
 9       in.ReadXxx()/readObject();
10 }
View Code

 ?自定義序列化機制可以加密提供安全性: 
  ·? private Object writeReplace()
    序列化對象objA時將對象objA替換成其他對象objB,然后調用writeObject()方法序列化對象objB,可繼承;
  ·? private Object readResolve()
    實現保護性復制整個對象,在readObject()之后調用,返回值會代替readObject()反序列化出來的對象以保證反序列化的正確性,常用于單例類、枚舉類的序列化,可繼承;
? · ? 完全自定義序列化機制
 允許完全由程序員自主決定存儲和恢復對象數據,必須實現接口Externalizable和如下方法
  ·? public void writeExternal(ObjectOutput out):保存對象的狀態;
  ·? public void readExternal(ObjectInput in):實現對象反序列化;
  方法實現體中,調用DataIn/Output(ObjectIn/Output的父接口)的方法保存/恢復基本類型的實例變量,調用ObjectIn/Output的read/writeObject()方法保存/恢復引用類型的實例變量。

 1 public class MyClass implements Externalizable{
 2       public MyClass(){}       // 無參的public構造函數
 3       @override
 4       public void writeExternal(ObjectOutput out) throws IOException{
 5           ...
 6       }
 7       @override
 8       public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{
 9           ...
10       }
11 }
View Code

? · ? 序列化機制版本
  Java序列化機制允許為序列化類提供private static final long serialVersionUID標識Java類的序列化版本,保證序列化版本的兼容性、有利于程序在不同JVM間的可移植性。

參考

  • Java對象序列化; 理解Java對象序列化; JAVA序列化機制;序列化介紹;
  • Java序列化格式詳解;?

NIO

Java的NIO參見:Java - NIO - sqh;

轉載于:https://www.cnblogs.com/wjcx-sqh/p/5929874.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256329.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Halcon —— 邊緣檢測算子詳解

一、算子介紹 1.1 種類 halcon內常用的邊緣檢測算子包括如下幾種&#xff1a; 1.edges_image: 提取2D 圖像邊緣 2.edges_sub_pix&#xff1a;提取2D圖像亞像素邊緣 3.edges_object_model_3d &#xff1a;提取3D圖像邊緣 4.edges_color和edges_color_sub_pix&#xff1a;提取彩…

【TensorFlow】——索引與切片

目錄 1、利用index進行索引 2、利用“&#xff1a;”和“...”進行索引與切片 3、tf.gather&#xff08;&#xff09;——對一個維度進行亂序索引 優勢&#xff1a; 缺點&#xff1a; 例子 4、tf.gather_nd()——同時對多個維度進行索引 5、tf.boolean_mask()——通過布…

華碩(ASUS)X554LP筆記本一開機就進入aptio setup utility 問題的解決

某次因大意一直未插電&#xff0c;華碩&#xff08;ASUS&#xff09;X554LP筆記本后來沒電關機。后來每次一開機就進入aptio setup utility界面&#xff0c;按F9調入默認配置&#xff0c;F10保存后退出&#xff0c;重啟仍然進入aptio setup utility。 網上查了一下&#xff0c;…

redis和memcached緩存

memcached memcache開源的&#xff0c;高性能&#xff0c;高并發分布式內存緩存系統,天生支持集群 memcached下載地址&#xff1a; http://memcached.org/downloads python實現memcached緩存 pip3 install python-memcached import memcache aamemcache.Client(["10.0.0.2…

C# —— 進程與線程的理解

定義 進程 進程&#xff08;Process&#xff09;是Windows系統中的一個基本概念&#xff0c;它包含著一個運行程序所需要的資源。一個正在運行的應用程序在操作系統中被視為一個進程&#xff0c;進程可以包括一個或多個線程。 程序是在特定操作系統上的可執行文件&#xff0c…

git安裝和初步使用

基本參照以下鏈接&#xff1a; http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137583770360579bc4b458f044ce7afed3df579123eca000 注意&#xff1a; &#xff08;1&#xff09;每臺電腦對于github來說都有對應的ssh密鑰&#xff0c;…

【TensorFlow】——broadcast_to(在不復制內存的情況下自動擴張tensor)

目錄 作用&#xff1a; 內在的思路 優點 什么時候可以broadcast ? tf.boradcast_to .VS tf.tile 作用&#xff1a; 在不會實際意義上復制數據的情況下進行tensor的維度和形狀的擴張&#xff0c;使得兩個tensor維度和形狀一致 對兩個維度不一致的tensor進行加減前進行br…

20145212 《信息安全系統設計基礎》第2周學習總結

20145212 《信息安全系統設計基礎》第2周學習總結 教材學習內容總結 Vim基本操作 1.使用vim命令進入vim界面vim后面加上你要打開的已存在的文件名或者不存在&#xff08;則作為新建文件&#xff09;的文件名。 打開Xfce終端&#xff0c;輸入以下命令$ vim practice_1.txt 直接使…

Opencv—— 擬合直線

概念 最小二乘法是勒讓德( A. M. Legendre)于1805年在其著作《計算慧星軌道的新方法》中提出的。 最小二乘法就是通過最小化誤差的平方和&#xff0c;使得擬合對象無限接近目標對象。在圖像處理中主要用于擬合線&#xff0c;通過求采樣點距離誤差最小的線&#xff0c;可以是直…

本地搭建Dubbo監控中心的安裝步驟

Dubbo監控中心的安裝步驟 參考鏈接&#xff1a;http://blog.csdn.net/lichunan/article/details/40349645 一、從github上下載dubbo源碼進行編譯&#xff1a; 1、下載地址為&#xff1a; https://github.com/alibaba/dubbo.git2、編譯源碼命令&#xff1a;首先進入~/dubbo&am…

(轉)SQLServer實例講解

歡迎和大家交流技術相關問題&#xff1a; 郵箱: jiangxinnju163.com 博客園地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/people/jiangxinnju 實例就是一個在數據庫中存在的&#xff0c;現實的數據…

Basler相機SDK相關問題收集與知識匯總

1.心跳時間導致報錯 此心跳非彼心跳,相機心跳是指過通過設置一個時間用于監測相機和網卡的連接,如果超過這個時間,相機就會釋放跟網卡的連接,進入一種允許相機被再次連接的狀態。 但此方式會導致相機SDK報錯,經常顯示在使用中,無可用連接,如何解決? 1.干等。不可取 2.…

14-會場安排問題

會場安排問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;4描述學校的小禮堂每天都會有許多活動&#xff0c;有時間這些活動的計劃時間會發生沖突&#xff0c;需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動&#xff0c;…

【TensorFlow】——實現minist數據集分類的前向傳播(常規神經網絡非卷積神經網絡)

目錄 一、常規神經網絡模型 二、TensorFlow實現前向傳播步驟 1、讀取數據集 2、batch劃分 3、根據神經網絡每一層的神經元個數來初始化參數w,b 4、進行每一層輸入輸出的計算 5、對每一層的輸出進行非線性relu函數變換 6、計算一個batch訓練后的誤差loss 7、計算每一次…

大道至簡第二章

懶人造就了方法 開頭說的&#xff0c;有一個人叫李冰也要移山&#xff0c;可是他卻要用和愚公截然不同的方法&#xff0c;那就是用“燒”的方法來碎石&#xff0c;那么這樣的好處就是省力。那么他又是怎樣想到的辦法的呢&#xff0c;就是生活中仔細觀察他老婆做飯時水溢出是石頭…

C# 回調函數詳解

回調和回調函數是什么 軟件模塊之間存在著接口&#xff0c;而回調是一種雙向調用模式&#xff0c;被調用方在接口被調用時也會調用對方的接口。 對于一般的結構化語言&#xff0c;可以通過回調函數來實現回調。回調函數是一個函數或過程&#xff0c;是一個由調用方自己實現&am…

神經網絡(11)--具體實現:unrolling parameters

我們需要將parameters從矩陣unrolling到向量&#xff0c;這樣我們就可以使用adanced optimization routines. unroll into vectors costFunction與fminunc里面的theta都是n1維的向量&#xff0c;costFunction的返回值gradient也是n1維的向量。 但是當我們使用神經網絡時&#x…

[轉]ASP.Net篇之Session與Cookie

本文轉自&#xff1a;http://www.cnblogs.com/japanbbq/archive/2011/08/31/2160494.html Session: Session是“會話”的意思&#xff0c;然而&#xff0c;因為http協議是無狀態的&#xff0c;那么每次客戶端請求服務器端&#xff0c;服務器端都會以“嶄新”的頁面展示給客戶端…

C# 接口詳解

概念 接口描述的是可屬于任何類或結構的一組相關行為&#xff0c;所以實現接口的類或結構必須實現接口定義中指定的接口成員。 定義&#xff1a;使用interface 關鍵字&#xff0c;由方法、屬性、事件、索引器或這四種成員類型的任意組合構成。另可使用new、public、protected、…