JavaIO之字元流
阿新 • • 發佈:2020-10-31
1、字元流
位元組流提供了處理任何型別輸入/輸出操作的功能(因為對於計算機而言,一切都是0和1,只需把資料以位元組形式表示就夠了),但它們不可以直接操作Unicode字元,因為一個Unicode字元佔用2個位元組,而位元組流一次只能操作一個位元組。既然Java的口號就是"一次編寫、處處執行",那麼包含直接的字元輸入/輸出的支援是必要的。因此就有一些字元輸入/輸出流,之前已經說明過了,字元流頂層是Reader和Writer這兩個抽象類。
2、Reader抽象類
Reader是定義Java的字元輸入流的抽象類,該類的所有方法在出錯的情況下都將引發IOException。Reader類中有這些方法:
3、Writer抽象類
Writer是定義字元輸出流的抽象類,所有該類的方法都返回一個void值並在出錯的條件下引發IOException。Writer類中的方法有:
4、FileReader和FileWriter
FileReader類建立了一個可以讀取檔案內容的Reader類,最常用的構造方法是:
方法 | 作用 |
abstract void close() | 關閉該流並釋放與之關聯的所有資源 |
void mark(int readAheadLimit) | 標記流中的當前位置 |
boolean markSupported() | 判斷此流是否支援mark()操作 |
int read() | 從檔案中讀取單個字元 |
int read(char[] cbuf) | 從檔案中讀取字元到cbuf,返回值-1,表示沒有讀取到資料。 |
abstract int read(char[] cbuf, int off, int len) |
將檔案中的字元讀入cbuf陣列,從off位置開始,讀取len個字元。 |
int read(CharBuffer target) | 試圖將檔案中的字元讀入指定的字元緩衝區 |
boolean ready() | 判斷是否準備讀取此流 |
void reset() | 重置該流 |
long skip(long n) | 跳過n個字元 |
方法 | 作用 |
Writer append(char c) |
將制定字元新增到此writer |
Writer append(CharSequence csq) | 將制定字元序列新增到此writer |
Writer append(CharSequence csq, int start, int end) | 將指定字元序列的子序列新增到此writer.Appendable |
abstract void close() | 但要先flush()它 |
abstract void flush() | 重新整理該流的緩衝 |
void write(char[] cbuf) | 將cbuf中的內容寫入檔案 |
abstract void write(char[] cbuf, int off, int len) | 將字元陣列cbuf中從off開始的len個位元組寫入檔案 |
void write(int c) | 寫入單個字元到檔案中 |
void write(String str) | 寫入字串到檔案中 |
void write(String str, int off, int len) | 寫入str從off位置開始的len個字元到檔案中 |
- 1、FileReader(String fileName)
- 2、FileReader(File file)
- 1、FileWriter(String fileName)
- 2、FileWriter(String fileName, boolean append)
- 3、FileWriter(File file)
import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.Reader; import java.io.Writer; public class FileReaderWriterTest { public static void main(String[] args) throws Exception{ File file = new File("D:/Files.txt"); Writer out = new FileWriter(file); // 宣告一個String型別物件 String str = "Hello World!!!"; out.write(str); out.close(); //讀檔案操作 Reader in = new FileReader(file); // 開闢一個空間用於接收檔案讀進來的資料 char c[] = new char[1024]; // 將c0的引用傳遞到read()方法之中,同時此方法返回讀入資料的個數 int i = in.read(c); in.close(); if(i==-1){ System.out.println("檔案中無資料"); }else{ System.out.println(new String(c, 0, i)); } } }
利用FileWriter和FileReader進行了一次的讀寫操作,先看一下D盤Files資料夾下是否有"writer.txt",假如有"writer.txt"那"writer.txt"中又是什麼:
看來利用FileWriter寫入一個記憶體中的字串到檔案中是成功了,那麼利用利用FileReader讀入檔案中的內容到記憶體呢,看一下執行結果Hello World!!!列印結果和檔案中的內容一致,說明FileReader的操作也成功。 這就是FileWriter和FileReader的使用,和FileOutputStream和FileInputStream的使用差不多,不過實際操作中一般不會用FileWriter和FileReader。 比較: InputStream和OutputStream類處理的是位元組流,資料流中的最小單位是位元組(8個bit);Reader與Writer處理的是字元流,在處理字元流時涉及了字元編碼的轉換問題 Reader類能夠將輸入流中採用其他編碼型別的字元轉換為Unicode字元,然後在記憶體中為其分配記憶體;Writer類能夠將記憶體中的Unicode字元轉換為其他編碼型別的字元,再寫到輸出流中。