日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java - I/O

發(fā)布時間:2023/12/13 java 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java - I/O 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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ù)雜度高;

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序列化機(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()手動序列化保存。

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

 ?自定義序列化機(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ù)引用類型的實例變量。

1 public class MyClass implements Externalizable{ 2 public MyClass(){} // 無參的public構(gòu)造函數(shù) 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

? · ? 序列化機(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。