淺談Java中的IO流

在進行設備、文件之間的數據傳輸的時候,如 文件的上傳和下載 ,我們可以使用IO流來進行處理。
在對文件和目錄進行操作時,我們需要將其包裝稱爲Java程序可以處理的形式,此時,就需要用到File類了。

File類

public class File 
extends Object 
implements Serializable, Comparable<File>

文件和目錄路徑名的抽象表示形式。
File類可以用來表示文件,也可以用來表示目錄。

構造方法

File(File parent, String child)
根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例。
File(String pathname) 
通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。
File(String parent, String child) 
根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例。
File(URI uri) 
通過將給定的 file: URI 轉換爲一個抽象路徑名來創建一個新的 File 實例。

成員方法

常用的File類的成員方法有:
用於創建的成員方法

public boolean createNewFile() throws IOException
當且僅當不存在具有此抽象路徑名指定名稱的文件時,不可分地創建一個新的空文件。
public boolean mkdir() 
創建此抽象路徑名指定的目錄。
public boolean mkdirs() 
創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。注意,此操作失敗時也可能已經成功地創建了一部分必需的父目錄。 

在創建文件或目錄時需要注意的是:如果創建文件或者目錄忘了寫盤符路徑,那麼就會默認在項目路徑下。

用於刪除的成員方法

public boolean delete()
刪除此抽象路徑名錶示的文件或目錄。如果此路徑名錶示一個目錄,則該目錄必須爲空才能刪除。

在使用刪除功能需要注意的是:使用Java中的刪除時,刪除是不走回收站的。要刪除一個文件夾,請注意該文件夾內不能包含文件或者文件夾。

用於重命名的成員方法

public boolean renameTo(File dest)
重新命名此抽象路徑名錶示的文件。

使用重命名功能需要注意的是:如果原文件和目標文件的路徑名相同,則進行的是重命名操作;如果原文件和目標文件的路徑名不相同,則執行的是剪切操作。

用於進行判斷的成員方法

public boolean isDirectory()
測試此抽象路徑名錶示的文件是否是一個目錄。 
public boolean isFile()
測試此抽象路徑名錶示的文件是否是一個標準文件。
public boolean exists()
測試此抽象路徑名錶示的文件或目錄是否存在。 
public boolean canRead()
測試應用程序是否可以讀取此抽象路徑名錶示的文件。 
public boolean canWrite()
測試應用程序是否可以修改此抽象路徑名錶示的文件。 
public boolean isHidden()
測試此抽象路徑名指定的文件是否是一個隱藏文件。
public boolean isAbsolute()
測試此抽象路徑名是否爲絕對路徑名。

用於獲取的成員方法

public File getAbsoluteFile()
返回此抽象路徑名的絕對路徑名形式。等同於 new File(this.getAbsolutePath())。 
public String getAbsolutePath()
返回此抽象路徑名的絕對路徑名字符串。 
public File getCanonicalFile() throws IOException
返回此抽象路徑名的規範形式。等同於 new File(this.getCanonicalPath())。 
public String getCanonicalPath() throws IOException
返回此抽象路徑名的規範路徑名字符串。 
public String getPath()
將此抽象路徑名轉換爲一個路徑名字符串。所得字符串使用默認名稱分隔符分隔名稱序列中的名稱。
public String getParent()
返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回 null。
public File getParentFile()
返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null。
public long getTotalSpace()
返回此抽象路徑名指定的分區大小。 
public long getFreeSpace()
返回此抽象路徑名指定的分區中未分配的字節數。 
public String getName()
返回由此抽象路徑名錶示的文件或目錄的名稱。該名稱是路徑名名稱序列中的最後一個名稱。如果路徑名名稱序列爲空,則返回空字符串。 
public long length()
返回由此抽象路徑名錶示的文件的長度。如果此路徑名錶示一個目錄,則返回值是不確定的。 
public long lastModified()
返回此抽象路徑名錶示的文件最後一次被修改的時間。 
public String[] list()
返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中的文件和目錄。 
public File[] listFiles()
返回一個抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中的文件。 
public String[] list(FilenameFilter filter)
返回一個字符串數組,這些字符串指定此抽象路徑名錶示的目錄中滿足指定過濾器的文件和目錄。
public File[] listFiles(FileFilter filter)
返回抽象路徑名數組,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定過濾器的文件和目錄。

瞭解File類的一些操作之後,我們就可以使用IO流來進行數據的傳輸了。

IO流概述

IO流是用來處理設備之間的數據傳輸。Java對數據的操作是以流的方式來進行操作的,Java用於操作流的對象都在IO包中(java.io)。

IO流的分類可按以下方式進行分類:

  • 按照數據的流向(即站在內存的角度):
    輸入流 讀入數據
    輸出流 寫入數據
  • 按照數據類型
    字節流:可以讀寫任意類型的文件,如音頻、視頻、文本文件等
    字符流:只能讀寫文本文件

字節流和字符流的選擇場景:

  1. 如果數據所在的文件通過windows自帶的記事本打開並能讀懂裏面的內容,就用字符流。其他用字節流。
  2. 如果不太清楚的話,就用字節流。

IO流基類

  • 字節流的抽象基類:
    InputStream(字節輸入流),OutStream(字節輸出流)
  • 字符流的抽象基類:
    Reader,Writer

由這四個類派生出來的子類名稱都是以其父類名作爲子類名的後綴。

FileOutputStream類

public class FileOutputStream extends OutputStream

文件輸出流是用於將數據寫入 File 或 FileDescriptor 的輸出流。

構造方法

public FileOutputStream(File file)
創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
FileOutputStream(File file, boolean append) 
創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
FileOutputStream(FileDescriptor fdObj) 
創建一個向指定文件描述符處寫入數據的輸出文件流,該文件描述符表示一個到文件系統中的某個實際文件的現有連接。
FileOutputStream(String name) 
創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
FileOutputStream(String name, boolean append) 
創建一個向具有指定 name 的文件中寫入數據的輸出文件流。

成員方法

最常使用的成員方法是write()和close()。
write()用於寫入往指定的文件寫入數據。
close()用於關閉打開的流。目的有兩個:

  • 通知系統釋放關於管理a.txt文件的資源
  • 讓Io流對象變成垃圾,等待垃圾回收器對其回收
public void close()
關閉此文件輸出流並釋放與此流有關的所有系統資源。此文件輸出流不能再用於寫入字節。 
public void write(byte[] b)
將 b.length 個字節從指定 byte 數組寫入此文件輸出流中。 
public void write(byte[] b,int off,int len)
將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此文件輸出流。
public void write(int b)
將指定字節寫入此文件輸出流。實現 OutputStream 的 write 方法。

FileInputStream類

public class FileInputStream extends InputStream

FileInputStream 從文件系統中的某個文件中獲得輸入字節。

構造方法

FileInputStream(File file) 
通過打開一個到實際文件的連接來創建一個 FileInputStream,該文件通過文件系統中的 File 對象 file 指定。
FileInputStream(FileDescriptor fdObj) 
通過使用文件描述符 fdObj 創建一個 FileInputStream,該文件描述符表示到文件系統中某個實際文件的現有連接。
FileInputStream(String name) 
通過打開一個到實際文件的連接來創建一個 FileInputStream,該文件通過文件系統中的路徑名 name 指定。

成員方法

最常用的成員方法有read()和close()。
read()用於讀取數據。
close用於關閉打開的流。

public void close()
關閉此文件輸入流並釋放與此流有關的所有系統資源。
public int read()
從此輸入流中讀取一個數據字節。如果沒有輸入可用,則此方法將阻塞。
public int read(byte[] b)
從此輸入流中將最多 b.length 個字節的數據讀入一個 byte 數組中。
public int read(byte[] b,int off,int len)
從此輸入流中將最多 len 個字節的數據讀入一個 byte 數組中。

BufferedOutputStream類

public class BufferedOutputStream extends FilterOutputStream

該類實現緩衝的輸出流。通過設置這種輸出流,應用程序就可以將各個字節寫入底層輸出流中,而不必針對每次字節寫入調用底層系統。
與FileOutputStream相比,BufferedOutputStream是比較高效的輸出流,因爲其底層維護了一個byte數組,用作緩衝區。

構造方法

BufferedOutputStream(OutputStream out) 
創建一個新的緩衝輸出流,以將數據寫入指定的底層輸出流。
BufferedOutputStream(OutputStream out, int size) 
創建一個新的緩衝輸出流,以將具有指定緩衝區大小的數據寫入指定的底層輸出流。

成員方法

最常用的成員方法爲write()、flush()和close()。

public void flush()
刷新此緩衝的輸出流。這迫使所有緩衝的輸出字節被寫出到底層輸出流中。 
public void write(int b)
將指定的字節寫入此緩衝的輸出流。 
public void write(byte[] b,int off,int len)
將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此緩衝的輸出流。 

BufferedInputStream類

public class BufferedInputStream extends FilterInputStream

BufferedInputStream 爲另一個輸入流添加一些功能,即緩衝輸入以及支持 mark 和 reset 方法的能力。在創建 BufferedInputStream 時,會創建一個內部緩衝區數組。在讀取或跳過流中的字節時,可根據需要從包含的輸入流再次填充該內部緩衝區,一次填充多個字節。mark 操作記錄輸入流中的某個點,reset 操作使得在從包含的輸入流中獲取新字節之前,再次讀取自最後一次 mark 操作後讀取的所有字節。

與FileInputStream相比,BufferedInputStream是比較高效的輸出流,因爲其底層維護了一個byte數組,用作緩衝區。

構造方法

BufferedInputStream(InputStream in) 
創建一個 BufferedInputStream 並保存其參數,即輸入流 in,以便將來使用。
BufferedInputStream(InputStream in, int size) 
創建具有指定緩衝區大小的 BufferedInputStream 並保存其參數,即輸入流 in,以便將來使用。

成員方法

最常用的成員方法有read()和close()。

public int read()
返回下一個數據字節,如果到達流末尾,則返回 -1。 
public int read(byte[] b,int off,int len)
從此字節輸入流中給定偏移量處開始將各字節讀取到指定的 byte 數組中。 
返回讀取的字節數;如果已到達流末尾,則返回 -1。 

OutputStreamWriter類

public class OutputStreamWriter extends Writer

OutputStreamWriter 是字符流通向字節流的橋樑:可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。

構造方法

OutputStreamWriter(OutputStream out) 
創建使用默認字符編碼的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, Charset cs) 
創建使用給定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
創建使用給定字符集編碼器的 OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName) 
創建使用指定字符集的 OutputStreamWriter。

成員方法

最常見的成員方法爲write()、flush()和close()。

public void close() 
關閉此流,但要先刷新它。
public void flush() 
刷新該流的緩衝。
public void write(int c)
寫入單個字符。
public void write(char[] cbuf,int off,int len)
寫入字符數組的某一部分。 
public void write(String str,int off,int len)
寫入字符串的某一部分。

由於轉換流的名字比較長,而常見的操作都是按照本地默認編碼實現的,所以,爲了簡化書寫,轉換流提供了對應的子類即FileWriter。

InputStreamReader類

public class InputStreamReader extends Reader

InputStreamReader 是字節流通向字符流的橋樑:它使用指定的 charset 讀取字節並將其解碼爲字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。

構造方法

InputStreamReader(InputStream in) 
創建一個使用默認字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs) 
創建使用給定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) 
創建使用給定字符集解碼器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 
創建使用指定字符集的 InputStreamReader。

成員方法

最常使用的成員方法是read()和close()。

public void close()
關閉該流並釋放與之關聯的所有資源。
public int read()
讀取單個字符。 
public int read(char[] cbuf,int offset,int length)
將字符讀入數組中的某一部分。

由於轉換流的名字比較長,而常見的操作都是按照本地默認編碼實現的,所以,爲了簡化書寫,轉換流提供了對應的子類即FileReader

BufferedWriter類

public class BufferedWriter extends Writer

將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。
可以指定緩衝區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。

該類提供了 newLine() 方法,它使用平臺自己的行分隔符概念,此概念由系統屬性 line.separator 定義。並非所有平臺都使用新行符 (’\n’) 來終止各行。因此調用此方法來終止每個輸出行要優於直接寫入新行符。

構造方法

BufferedWriter(Writer out) 
創建一個使用默認大小輸出緩衝區的緩衝字符輸出流。
BufferedWriter(Writer out, int sz) 
創建一個使用給定大小輸出緩衝區的新緩衝字符輸出流。

成員方法

常見的成員方法:

public void close() 
關閉此流,但要先刷新它。
public void flush() 
刷新該流的緩衝。
public void newLine()
寫入一個行分隔符。行分隔符字符串由系統屬性 line.separator 定義,並且不一定是單個新行 ('\n') 符。
public void write(int c)
寫入單個字符。
public void write(char[] cbuf,int off,int len)
寫入字符數組的某一部分。
public void write(String s,int off,int len)
寫入字符串的某一部分。 

BufferedReader類

public class BufferedReader extends Reader

從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。
可以指定緩衝區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。

構造方法

BufferedReader(Reader in) 
創建一個使用默認大小輸入緩衝區的緩衝字符輸入流。
BufferedReader(Reader in, int sz) 
創建一個使用指定大小輸入緩衝區的緩衝字符輸入流。

成員方法

常見的方法:

public void close() 
關閉該流並釋放與之關聯的所有資源。
public int read()
讀取單個字符。 
public int read(char[] cbuf, int off, int len) 
將字符讀入數組的某一部分。
public String readLine()
讀取一個文本行。通過下列字符之一即可認爲某行已終止:換行 ('\n')、回車 ('\r') 或回車後直接跟着換行。

DataInputStream類

public class DataInputStream extends FilterInputStream implements DataInput

數據輸入流允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型。應用程序可以使用數據輸出流寫入稍後由數據輸入流讀取的數據。
DataInputStream 對於多線程訪問不一定是安全的。

構造方法

DataInputStream(InputStream in) 
使用指定的底層 InputStream 創建一個 DataInputStream。

成員方法

該類可以讀取基本類型的數據,此處列舉幾個成員方法爲例。

public final int read(byte[] b)
從包含的輸入流中讀取一定數量的字節,並將它們存儲到緩衝區數組 b 中。
public int read(byte[] b, int off, int len) 
從包含的輸入流中將最多 len 個字節讀入一個 byte 數組中。
public final boolean readBoolean()
返回讀取的 boolean 值
public final int readInt()
返回此輸入流的下四個字節,將它們解釋爲一個 int。
public final String readUTF()
返回一個 Unicode 字符串。 

DataOutputStream類

public class DataOutputStream extends FilterOutputStream implements DataOutput

數據輸出流允許應用程序以適當方式將基本 Java 數據類型寫入輸出流中。然後,應用程序可以使用數據輸入流將數據讀入。

構造方法

DataOutputStream(OutputStream out) 
創建一個新的數據輸出流,將數據寫入指定基礎輸出流。

成員方法

該類可以寫入基本類型的數據,此處列舉幾個成員方法爲例。

public void flush() 
清空此數據輸出流。
public void write(byte[] b, int off, int len) 
將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入基礎輸出流。
public void write(int b)
將指定字節(參數 b 的八個低位)寫入基礎輸出流。
public final void writeChar(int v)
將一個 char 值以 2-byte 值形式寫入基礎輸出流中,先寫入高字節。
public final void writeInt(int v)
將一個 int 值以 4-byte 值形式寫入基礎輸出流中,先寫入高字節。
public final void writeUTF(String str)
以與機器無關方式使用 UTF-8 修改版編碼將一個字符串寫入基礎輸出流。

ByteArrayOutputStream類

public class ByteArrayOutputStream extends OutputStream

此類實現了一個輸出流,其中的數據被寫入一個 byte 數組。緩衝區會隨着數據的不斷寫入而自動增長。可使用 toByteArray() 和 toString() 獲取數據。
關閉 ByteArrayOutputStream 無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何 IOException。

構造方法

ByteArrayOutputStream() 
創建一個新的 byte 數組輸出流。
ByteArrayOutputStream(int size) 
創建一個新的 byte 數組輸出流,它具有指定大小的緩衝區容量(以字節爲單位)。

成員方法

public void close()
關閉 ByteArrayOutputStream 無效。
public int size()
返回緩衝區的當前大小。
public byte[] toByteArray()
 創建一個新分配的 byte 數組。
public String toString()
使用平臺默認的字符集,通過解碼字節將緩衝區內容轉換爲字符串。
public String toString(String charsetName)
使用指定的 charsetName,通過解碼字節將緩衝區內容轉換爲字符串。
public void write(byte[] b,int off,int len)
將指定 byte 數組中從偏移量 off 開始的 len 個字節寫入此 byte 數組輸出流。
public void write(int b)
將指定的字節寫入此 byte 數組輸出流。

ByteArrayInputStream類

public class ByteArrayInputStream extends InputStream

ByteArrayInputStream 包含一個內部緩衝區,該緩衝區包含從流中讀取的字節。內部計數器跟蹤 read 方法要提供的下一個字節。
關閉 ByteArrayInputStream 無效。此類中的方法在關閉此流後仍可被調用,而不會產生任何 IOException。

構造方法

ByteArrayInputStream(byte[] buf) 
創建一個 ByteArrayInputStream,使用 buf 作爲其緩衝區數組。
ByteArrayInputStream(byte[] buf, int offset, int length) 
創建 ByteArrayInputStream,使用 buf 作爲其緩衝區數組。

成員方法

public void close()
關閉 ByteArrayInputStream 無效。
public int read()
從此輸入流中讀取下一個數據字節。返回一個 0 到 255 範圍內的 int 字節值。
public int read(byte[] b,int off,int len)
將最多 len 個數據字節從此輸入流讀入 byte 數組。

PrintStream類

public class PrintStream extends FilterOutputStream implements Appendable, Closeable

PrintStream 爲其他輸出流添加了功能,使它們能夠方便地打印各種數據值表示形式。它還提供其他兩項功能。與其他輸出流不同,PrintStream 永遠不會拋出 IOException;而是,異常情況僅設置可通過 checkError 方法測試的內部標誌。另外,爲了自動刷新,可以創建一個 PrintStream;這意味着可在寫入 byte 數組之後自動調用 flush 方法,可調用其中一個 println 方法,或寫入一個換行符或字節 (’\n’)。

構造方法

PrintStream(File file) 
創建具有指定文件且不帶自動行刷新的新打印流。
PrintStream(File file, String csn) 
創建具有指定文件名稱和字符集且不帶自動行刷新的新打印流。
PrintStream(OutputStream out) 
創建新的打印流。
PrintStream(OutputStream out, boolean autoFlush) 
創建新的打印流。
PrintStream(OutputStream out, boolean autoFlush, String encoding) 
創建新的打印流。
PrintStream(String fileName) 
創建具有指定文件名稱且不帶自動行刷新的新打印流。
PrintStream(String fileName, String csn) 
創建具有指定文件名稱和字符集且不帶自動行刷新的新打印流。

成員方法

public void close()
關閉流。
public void flush()
刷新該流的緩衝。
public void print(int i)
打印整數。
public void println(int x)
打印整數,然後終止該行。
public void write(byte[] buf,int off,int len)
將 len 字節從指定的初始偏移量爲 off 的 byte 數組寫入此流。
public void write(int b) 
將指定的字節寫入此流。

PrintWriter類

public class PrintWriter extends Writer

向文本輸出流打印對象的格式化表示形式。此類實現在 PrintStream 中的所有 print 方法。它不包含用於寫入原始字節的方法,對於這些字節,程序應該使用未編碼的字節流進行寫入。
與 PrintStream 類不同,如果啓用了自動刷新,則只有在調用 println、printf 或 format 的其中一個方法時纔可能完成此操作,而不是每當正好輸出換行符時才完成。這些方法使用平臺自有的行分隔符概念,而不是換行符。

構造方法

PrintWriter(File file) 
使用指定文件創建不具有自動行刷新的新 PrintWriter。
PrintWriter(File file, String csn) 
創建具有指定文件和字符集且不帶自動刷行新的新 PrintWriter。
PrintWriter(OutputStream out) 
根據現有的 OutputStream 創建不帶自動行刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush) 
通過現有的 OutputStream 創建新的 PrintWriter。
PrintWriter(String fileName) 
創建具有指定文件名稱且不帶自動行刷新的新 PrintWriter。
PrintWriter(String fileName, String csn) 
創建具有指定文件名稱和字符集且不帶自動行刷新的新 PrintWriter。
PrintWriter(Writer out) 
創建不帶自動行刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush) 
創建新 PrintWriter。

成員方法

常見的成員方法

public void close()
關閉該流並釋放與之關聯的所有系統資源。
public void flush()
刷新該流的緩衝。
public void print(int i)
打印整數。
public void println(int x) 
打印整數,然後終止該行。
public void write(char[] buf)
寫入字符數組。
public void write(char[] buf,int off,int len)
寫入字符數組的某一部分。 
public void write(int c)
寫入單個字符。
public void write(String s)
寫入字符串。
public void write(String s,int off,int len)
寫入字符串的某一部分。 

打印流的特點:

  • 打印流只能操作目的地,不能操作數據源(不能進行讀取數據)
  • 可以操作任意數據類型的數據,調用print() 方法可以寫任意數據類型
  • 如果啓用自動刷新,那麼在調用println、printf 或 format 方法中的一個方法的時候,會完成自動刷新
  • 這個流可以直接對文件進行操作(可以直接操作文件的流:即構造方法的參數可以傳遞文件或者文件路徑)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章