字符流 FileReader 和 FileWriter
FileReader 和 FileWriter 是使用字符直接對文件的讀與寫操作
FileReader
| 構造方法 | 說明 |
|---|---|
| FileReader(File file) | 在給定從中讀取數(shù)據(jù)的 File 的情況下創(chuàng)建一個新 FileReader |
| FileReader(FileDescriptor fd) | 在給定從中讀取數(shù)據(jù)的 FileDescriptor 的情況下創(chuàng)建一個新 FileReader |
| FileReader(String fileName) | 在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個新 FileReader |
FileWriter
| 構造方法 | 說明 |
|---|---|
| FileWriter(File file) | 根據(jù)給定的 File 對象構造一個 FileWriter 對象 |
| FileWriter(File file, boolean append) | 根據(jù)給定的 File 對象構造一個 FileWriter 對象 |
| FileWriter(FileDescriptor fd) | 構造與某個文件描述符相關聯(lián)的 FileWriter 對象 |
| FileWriter(String fileName) | 根據(jù)給定的文件名構造一個 FileWriter 對象 |
| FileWriter(String fileName, boolean append) | 據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的 boolean 值來構造 FileWriter 對象 |
示例
使用FileReader和FileWriter類完成文本文件復制,步驟:
- 創(chuàng)建讀(FileReader)對象
- 創(chuàng)建寫(FileWriter)對象
- 循環(huán)讀取的數(shù)據(jù),寫入到目標文件中
- 關閉寫(FileWriter)對象
- 關閉讀(FileReader)對象
關于讀寫對象的關閉順序不可變
一次讀一個字符
/**
* 文本文件復制,一次讀一個字符
*
* @param fr
* @param fw
* @throws IOException
*/
public static void copy1(FileReader fr, FileWriter fw) throws IOException {
int ch;
while ((ch = fr.read()) != -1) {// 讀數(shù)據(jù)
fw.write(ch);// 寫數(shù)據(jù)
}
fw.flush();
}
一次讀一個字符數(shù)組
/**
* 文本文件復制,一次讀一個字符數(shù)組
*
* @param fr
* @param fw
* @throws IOException
*/
public static void copy2(FileReader fr, FileWriter fw) throws IOException {
char chs[] = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {// 讀數(shù)據(jù)
fw.write(chs, 0, len);// 寫數(shù)據(jù)
}
fw.flush();
}
測試
public static void main(String[] args) throws IOException {
// 創(chuàng)建輸入流對象
// 文件不存在會拋出java.io.FileNotFoundException
FileReader fr = new FileReader("d:\\Test\\copyfrom.txt");
// 創(chuàng)建輸出流對象
FileWriter fw = new FileWriter("d:\\Test\\copyto.txt");
// 創(chuàng)建輸出流做的工作: 1、調(diào)用系統(tǒng)資源創(chuàng)建了一個文件 2、創(chuàng)建輸出流對象 3、把輸出流對象指向文件
copy1(fr, fw);
copy2(fr, fw);
fr.close();
fw.close();
}
字符緩沖流BufferedReader和BufferedWriter
緩沖流可以讀取到一個字節(jié)/字符,先不輸出,等湊足了緩沖的最大容量后一次性寫出去,從而提高了工作效率
優(yōu)點:減少對硬盤的讀取次數(shù),降低對硬盤的損耗
BufferedReader
字符緩沖流具備文本特有的表現(xiàn)形式,行操作
public class BufferedReader extends Reader
- 從字符輸入流中讀取文本,緩沖各個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取。
- 可以指定緩沖區(qū)的大小,或者可使用默認的大小。大多數(shù)情況下,默認值就足夠大了。
- 通常,Reader 所作的每個讀取請求都會導致對底層字符或字節(jié)流進行相應的讀取請求。因此,建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和 InputStreamReader)
BufferedReader 有一個新方法:readLine ??梢砸淮巫x取一行數(shù)據(jù)。
BufferedWriter
BufferedReader in = new BufferedReader(new FileReader("foo.in"));
- 將緩沖指定文件的輸入。如果沒有緩沖,則每次調(diào)用 read() 或 readLine() 都會導致從文件中讀取字節(jié),并將其轉(zhuǎn)換為字符后返回,而這是極其低效的。
public class BufferedWriter extends Writer
將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數(shù)組和字符串的高效寫入。
可以指定緩沖區(qū)的大小,或者接受默認的大小。在大多數(shù)情況下,默認值就足夠大了。
該類提供了 newLine() 方法,它使用平臺自己的行分隔符概念,此概念由系統(tǒng)屬性 line.separator 定義。并非所有平臺都使用新行符 ('\n') 來終止各行。因此調(diào)用此方法來終止每個輸出行要優(yōu)于直接寫入新行符。
-
通常 Writer 將其輸出立即發(fā)送到底層字符或字節(jié)流。除非要求提示輸出,否則建議用 BufferedWriter 包裝所有其 write() 操作可能開銷很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 緩沖 PrintWriter 對文件的輸出。如果沒有緩沖,則每次調(diào)用 print() 方法會導致將字符轉(zhuǎn)換為字節(jié),然后立即寫入到文件,而這是極其低效的。
示例
使用BufferedReader和BufferedWriter完成文件復制
使用 char 做數(shù)據(jù)讀取
/**
* 和字符流一樣,使用 char 做數(shù)據(jù)讀取
* @param source
* @param target
* @throws IOException
*/
public static void byteCopy(String source, String target) throws IOException {
// 創(chuàng)建輸入流對象
BufferedReader br = new BufferedReader(new FileReader(source));// 文件不存在會拋出java.io.FileNotFoundException
// 創(chuàng)建輸出流對象
BufferedWriter bw = new BufferedWriter(new FileWriter(target));
// 文本文件復制
char[] chs = new char[1024];
int len = 0;
while ((len = br.read(chs)) != -1) {
bw.write(chs, 0, len);
}
// 釋放資源
br.close();
bw.close();
}
BufferedReader對象使用 readLine 方法讀取數(shù)據(jù)
/**
* BufferedReader對象使用 readLine 方法讀取數(shù)據(jù)
* @param source
* @param target
* @throws IOException
*/
public static void stringCopy(String source, String target) throws IOException {
// 創(chuàng)建輸入流對象
// 文件不存在會拋出java.io.FileNotFoundException
BufferedReader br = new BufferedReader(new FileReader(source));
// 創(chuàng)建輸出流對象
BufferedWriter bw = new BufferedWriter(new FileWriter(target));
String str = br.readLine();
while (null != str ) {
//一定是先寫入數(shù)據(jù),然后再讀取下一行。
//注意默認沒有換行,所以需要自己添加換行符
bw.write(str +"\n");
str = br.readLine();
}
// 釋放資源
br.close();
bw.close();
}
測試
public static void main(String[] args) throws IOException {
byteCopy("d:/source.txt" , "d:/target.txt");
stringCopy("d:/source.txt" , "d:/target.txt");
}