Java IO总结
一、概要
Java I/O主要包括如下幾個層次,包含三個部分:
- 流式部分――IO的主體部分;
- 非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;
- 其他類--文件讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地操作系統相關的文件系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。
主要的類如下:
- File(文件特征與管理):用于文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。
- InputStream(二進制格式操作):抽象類,基于字節的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特征。
- OutputStream(二進制格式操作):抽象類。基于字節的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
- Reader(文件格式操作):抽象類,基于字符的輸入操作。
- Writer(文件格式操作):抽象類,基于字符的輸出操作。
- RandomAccessFile(隨機文件操作):一個獨立的類,直接繼承至Object.它的功能豐富,可以從文件的任意位置進行存取(輸入輸出)操作。
?Java中IO流的體系結構如圖:
Java流類的類結構圖:
二、字節流
2.1 輸入字節流?InputStream
基本輸入字節流:
? 裝飾輸入字節流:
? InputStream中的三個基本的讀方法
-
- abstract int read()?:讀取一個字節數據,并返回讀到的數據,如果返回-1,表示讀到了輸入流的末尾。
- int? read(byte[] b)?:將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。
- int? read(byte[] b, int off, int len)?:將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。off指定在數組b中存放數據的起始偏移位置;len指定讀取的最大字節數。
流結束的判斷:方法read()的返回值為-1時;readLine()的返回值為null時。
其它方法
-
- long skip(long n):在輸入流中跳過n個字節,并返回實際跳過的字節數。
- int available()?:返回在不發生阻塞的情況下,可讀取的字節數。
- void close()?:關閉輸入流,釋放和這個流相關的系統資源。
- void mark(int readlimit)?:在輸入流的當前位置放置一個標記,如果讀取的字節數多于readlimit設置的值,則流忽略這個標記。
- void reset()?:返回到上一個標記。
- boolean markSupported()?:測試當前流是否支持mark和reset方法。如果支持,返回true,否則返回false。
? 基本輸出字節流:
裝飾輸出字節流:
OutputStream中的三個基本的讀方法
-
- abstract void write(int b):往輸出流中寫入一個字節。
- void write(byte[] b)?:往輸出流中寫入數組b中的所有字節。
- void write(byte[] b, int off, int len)?:往輸出流中寫入數組b中從偏移量off開始的len個字節的數據。
其它方法
-
- void flush()?:刷新輸出流,強制緩沖區中的輸出字節被寫出。
- void close()?:關閉輸出流,釋放和這個流相關的系統資源。
三、字符流
?3.1 輸入字符流 Reader
?
在上面的繼承關系圖中可以看出:
-
- Reader是所有的輸入字符流的父類,它是一個抽象類。
- CharReader、StringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。
- BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。
- FilterReader是所有自定義具體裝飾流的父類,其子類PushbackReader對Reader對象進行裝飾,會增加一個行號。
- InputStreamReader是一個連接字節流和字符流的橋梁,它將字節流轉變為字符流。FileReader可以說是一個達到此功能、常用的工具類,在其源代碼中明顯使用了將FileInputStream轉變為Reader的方法。我們可以從這個類中得到一定的技巧。Reader中各個類的用途和使用方法基本和InputStream中的類使用一致。后面會有Reader與InputStream的對應關系。
? 主要方法:
-
- public?int?read()?throws?IOException;?//讀取一個字符,返回值為讀取的字符?
- public?int?read(char?cbuf[])?throws?IOException;?/*讀取一系列字符到數組cbuf[]中,返回值為實際讀取的字符的數量*/?
- public?abstract?int?read(char?cbuf[],int?off,int?len)?throws?IOException; /*讀取len個字符,從數組cbuf[]的下標off處開始存放,返回值為實際讀取的字符數量,該方法必須由子類實現*/?
??3.2 輸出字符流?Writer
?
在上面的關系圖中可以看出:
-
- Writer是所有的輸出字符流的父類,它是一個抽象類。
- CharArrayWriter、StringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,
- BufferedWriter是一個裝飾器為Writer提供緩沖功能。
- PrintWriter和PrintStream極其類似,功能和使用也非常相似。
- OutputStreamWriter是OutputStream到Writer轉換的橋梁,它的子類FileWriter其實就是一個實現此功能的具體類(具體可以研究一SourceCode)。功能和使用和OutputStream極其類似.
? 主要方法:
-
- public?void?write(int?c)?throws?IOException;?//將整型值c的低16位寫入輸出流
- public?void?write(char?cbuf[])?throws?IOException;?//將字符數組cbuf[]寫入輸出流
- public?abstract?void?write(char?cbuf[],int?off,int?len)?throws?IOException;?//將字符數組cbuf[]中的從索引為off的位置處開始的len個字符寫入輸出流
- public?void?write(String?str)?throws?IOException;?//將字符串str中的字符寫入輸出流
- public?void?write(String?str,int?off,int?len)?throws?IOException;?//將字符串str?中從索引off開始處的len個字符寫入輸出流?
四、字符流和字節流的轉換
OutputStreamWriter(OutStreamout):將字節流以字符流輸出。 字符到字節的橋梁
InputStreamReader(InputStream?in):將字節流以字符流輸入。 字節到字符的橋梁
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:/1.jpg")),"utf-8"));五、非流式文件類--File類
? File類是對文件系統中文件以及文件夾進行封裝的對象,可以通過對象的思想來操作文件和文件夾。File類保存文件或目錄的各種元數據信息,包括文件名、文件長度、最后修改時間、是否可讀、獲取當前文件的路徑名,判斷指定文件是否存在、獲得當前目錄中的文件列表,創建、刪除文件和目錄等方法。?
構造函數:
- File (String ? pathname)? ?
- 例:File ?f1=new File("FileTest1.txt"); //創建文件對象f1,f1所指的文件是在當前目錄下創建的FileTest1.txt
- File (String ?parent ?, ?String child)
- 例:File f2=new ?File(“D:\\dir1","FileTest2.txt") ;// ?注意:D:\\dir1目錄事先必須存在,否則異常
- File (File ? ?parent ?, String child)
- 例:File ?f4=new File("\\dir3");? File ?f5=new File(f4,"FileTest5.txt"); ?//在如果 \\dir3目錄不存在使用f4.mkdir()先創建
一個對應于某磁盤文件或目錄的File對象一經創建, 就可以通過調用它的方法來獲得文件或目錄的屬性。 ??
?? 1)public boolean exists( ) 判斷文件或目錄是否存在
? ? ? ?2)public boolean isFile( ) 判斷是文件還是目錄?
? ? ? ?3)public boolean isDirectory( ) 判斷是文件還是目錄
? ? ? ?4)public String getName( ) 返回文件名或目錄名
? ? ? ?5)public String getPath( ) 返回文件或目錄的路徑。
? ? ? ?6)public long length( ) 獲取文件的長度?
? ? ? ?7)public String[ ] list ( ) 將目錄中所有文件名保存在字符串數組中返回。?
? ? ? ?File類中還定義了一些對文件或目錄進行管理、操作的方法,常用的方法有:
? ? ? ?1) public boolean renameTo( File newFile ); ? ?重命名文件
? ? ? ?2) public void delete( ); ? 刪除文件
? ? ? ?3) public boolean mkdir( ); 創建目錄
?六、RandomAccessFile類
文件的分隔與合并,隨機訪問文件。
?
1.????該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。
?
2.????該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)
1 public static void main(String[] args) 2 { 3 try 4 { 5 insert("d:/out.txt",5,"插入的內容"); 6 } 7 catch (IOException e) 8 { 9 e.printStackTrace(); 10 } 11 } 12 13 private static void insert(String fileName,long pos,String content) throws IOException 14 { 15 //創建臨時空文件 16 File tempFile = File.createTempFile("temp",null); 17 //在虛擬機終止時,請求刪除此抽象路徑名表示的文件或目錄 18 tempFile.deleteOnExit(); 19 FileOutputStream fos = new FileOutputStream(tempFile); 20 21 RandomAccessFile raf = new RandomAccessFile(fileName,"rw"); 22 raf.seek(pos); 23 byte[] buffer = new byte[4]; 24 int num = 0; 25 while(-1 != (num = raf.read(buffer))) 26 { 27 fos.write(buffer,0,num); 28 } 29 raf.seek(pos); 30 raf.write(content.getBytes()); 31 FileInputStream fis = new FileInputStream(tempFile); 32 while(-1 != (num = fis.read(buffer))) 33 { 34 raf.write(buffer,0,num); 35 } 36 } 指定位置插入內容七、System類對IO的支持
針對一些頻繁的設備交互,Java語言系統預定了3個可以直接使用的流對象,分別是:
?System.in(標準輸入),通常代表鍵盤輸入。其數據類型為InputStream
?System.out(標準輸出):通常寫往顯示器。其數據類型為PrintStream
?System.err(標準錯誤輸出):通常寫往顯示器。其數據類型為PrintStream
?
posted on 2018-11-29 20:07 ErBing 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/erbing/p/10040281.html
總結
- 上一篇: 灾备
- 下一篇: redis:消息发布与订阅频道