字符流
Java提供一些字符流類,以字符為單位讀寫資料,專門用于處理文本檔案,
字符輸入流(Reader)
java.io.Reader抽象類是表示用于讀取字符流的所有類的超類,可以讀取字符資訊到記憶體中,它定義了字符輸入流的基本共性功能方法,
public int read(): 從輸入流讀取一個字符,public int read(char[] cbuf): 從輸入流中讀取一些字符,并將它們存盤到字符陣列 cbuf中 ,public void close():關閉此流并釋放與此流相關聯的任何系統資源,
FileReader類
java.io.FileReader 類是用于讀取字符檔案的類,構造時使用系統默認的字符編碼和默認位元組緩沖區,
構造方法
| Constructor | Description |
|---|---|
FileReader(File file) |
創建一個新的 FileReader ,給定要讀取的File物件, |
FileReader(String fileName) |
創建一個新的 FileReader ,給定要讀取的檔案的名稱, |
FileReader類中沒有自己寫方法,都是繼承了父類InputStreamReader的方法,

使用
使用步驟與檔案位元組輸入流幾乎一致!也是三種read方法
| 方法 | 描述 |
|---|---|
| int read() | 從此輸入流中讀取一個資料位元組, |
| int read(byte[] b) | 從此輸入流中將最多 b.length 個位元組的資料讀入一個 byte 陣列中, |
| int read(byte[] b, int off, int len) | 從此輸入流中將最多 len 個位元組的資料讀入一個 byte 陣列中, |
| void close() | 關閉此檔案輸入流并釋放與此流有關的所有系統資源, |
例子
package characterstream;
import java.io.FileReader;
import java.io.IOException;
public class TestReader {
public static void main(String[] args) throws IOException {
// 1.創建FileReader物件
FileReader fr = new FileReader("test.txt");
// 2.使用read()方法逐個讀取字符
int len = 0;
while ((len = fr.read()) != -1) {
System.out.println((char)len);
}
// 3.釋放資源
fr.close();
}
}
字符輸出流(Writer)
java.io.Writer 抽象類是表示用于寫出字符流的所有類的超類,將指定的字符資訊寫出到目的地,
它定義了位元組輸出流的基本共性功能方法,
void write(int c)寫入單個字符,void write(char[] cbuf)寫入字符陣列,abstract void write(char[] cbuf, int off, int len)寫入字符陣列的某一部分,off陣列的開始索引,len寫的字符個數,void write(String str)寫入字串,void write(String str, int off, int len)寫入字串的某一部分,off字串的開始索引,len寫的字符個數,void flush()重繪該流的緩沖,void close()關閉此流,但要先重繪它,
FileWriter類
java.io.FileWriter 類是寫出字符到檔案的便利類,構造時使用系統默認的字符編碼和默認位元組緩沖區,
作用:把記憶體中的字符資料寫入到目的檔案中
構造方法
| Constructor | Description |
|---|---|
FileWriter(File file) |
創建一個新的 FileWriter,給定要讀取的File物件, |
FileWriter(File file, boolean append) |
給一個File物件構造一個FileWriter物件,append為true追加內容, |
FileWriter(String fileName) |
創建一個新的 FileWriter,給定要讀取的檔案的名稱, |
FileWriter(String fileName, boolean append) |
構造一個給定檔案名的FileWriter物件,append為true追加內容, |
FileWriter(FileDescriptor fd) |
構造與檔案描述符關聯的FileWriter物件, |
使用步驟
- 創建FileWriter物件,構造方法中系結要寫入的目的地
- 使用FileWriter中的方法write,把資料寫入到記憶體緩沖區中(有一個字符轉成位元組的程序)
- 使用FileWriter物件的flush方法,把記憶體緩沖區中的資料,重繪到檔案中,!與位元組輸出流的區別在此!
- 釋放資源(會先把記憶體緩沖區的資料重繪到檔案再關閉資源)
package characterstream;
import java.io.FileWriter;
import java.io.IOException;
public class TestWriter {
public static void main(String[] args) throws IOException {
// 1. 創建FileWriter物件,構造方法中系結要寫入的目的地
FileWriter fw = new FileWriter("test.txt");
// 2. 使用FileWriter中的方法write,把資料寫入到記憶體緩沖區中(有一個字符轉成位元組的程序)
fw.write('0');
fw.write("\r\n");
char[] buf = {'a', 'b', 'c', 'd', 'e'};
fw.write(buf);
fw.write("\r\n");
fw.write(buf,0,3);
fw.write("\r\n");
fw.write("233");
fw.write("\r\n");
fw.write("123456",3,3);
fw.write("\r\n");
// 3. 使用FileWriter物件的flush方法,把記憶體緩沖區中的資料,重繪到檔案中,!與位元組輸出流的區別在此!
fw.flush();
// 4. 釋放資源(會先把記憶體緩沖區的資料重繪到檔案再關閉資源)
fw.close();
}
}
注意檔案字符輸出類可以直接寫字串,而檔案位元組輸出流需要將字串轉成位元組陣列,
test.txt內容
0
abcde
abc
233
456
IO例外的處理
JDK7之前處理
之前的入門練習,我們一直把例外拋出,而實際開發中并不能這樣處理,建議使用try...catch...finally 代碼塊,
處理例外部分,代碼使用演示:
package characterstream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* jdk7之前的IO例外處理方式
*/
public class CopyJDK7 {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("data1.txt");
fw = new FileWriter("data2.txt");
// 注意這里已經不是位元組流,不是byte[]
char[] bytes = new char[1024];
int len = 0;
while ((len = fr.read(bytes)) != -1) {
fw.write(bytes, 0, len);
fw.flush();
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
看著這么多大括號,太影響代碼的可讀性了!
JDK7的處理(擴展知識)
JDK7優化后的try-with-resource 陳述句,該陳述句確保了每個資源在陳述句結束時關閉,
所謂的資源(resource)是指在程式完成后,必須關閉的物件,
package characterstream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* jdk7的新特性:
* try (創建流物件陳述句,如果創建多個流使用';'隔開) {
* // 讀寫資料
* } catch (IOException e) {
* // 例外處理
* }
*/
public class CopyJDK7 {
public static void main(String[] args) {
// JDK7新特性,在try后面加個括號并在里面定義流物件,會自動釋放資源
try (FileReader fr = new FileReader("data1.txt");
FileWriter fw = new FileWriter("data2.txt")) {
// 邏輯代碼不變,定義提前
char[] bytes = new char[1024];
int len = 0;
while ((len = fr.read(bytes)) != -1) {
fw.write(bytes, 0, len);
fw.flush();
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
System.out.println("復制完成");
}
}
JDK9的也做了些改進,但不好用就不寫了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/177275.html
標籤:Java
上一篇:Java - IO - 位元組流
