JavaIO流之FileReader與FileWriter
阿新 • • 發佈:2021-06-29
一、流的分類:
- 操作資料單位:位元組流、字元流
- 資料的流向:輸入流、輸出流
- 流的角色:節點流、處理流
二、流的體系結構
抽象基類
InputStream
OutputStream
Reader
Writer
節點流(或檔案流)
FileInputStream (read(byte[] buffer))
FileOutputSteam (write(byte[] buffer,0,len))
FileReader (read(char[] cbuf))
FileWriter (write(char[] cbuf,0,len))
緩衝流(處理流的一種)
BufferedInputStream (read(byte[] buffer))
BufferedOutputStream (write(byte[] buffer,0,len)) / flush()
BufferedReader (read(char[] cbuf) / readLine())
BufferedWriter (write(char[] cbuf,0,len)) / flush()
三、FileReader的使用
使用FileReader將當前module下的hello.txt檔案內容讀入程式中,並輸出到控制檯。
說明點:
- read()的理解:返回讀入的一個字元。如果達到檔案末尾,返回-1
- 異常的處理:為了保證流資源一定可以執行關閉操作,需要使用try-catch-finally處理
- 讀入的檔案一定要存在,否則就會報FileNotFoundException。
測試程式碼:
@Test public void testFileReader() { FileReader fr = null; try { //1.例項化File類的物件,指明要操作的檔案 File file = new File("hello.txt"); //2.提供具體的流 fr = new FileReader(file); //3.資料的讀入 //read():返回讀入的一個字元。如果達到檔案末尾,返回-1 int data; while ((data = fr.read())!= -1){ System.out.print((char)data); } } catch (IOException e) { e.printStackTrace(); } finally { //4.流的關閉操作 try { if (fr != null) fr.close(); } catch (IOException e) { e.printStackTrace(); } } } //對read()操作升級:使用read的過載方法 @Test public void testFileReader1(){ FileReader fr = null; try { //1.File類的例項化 File file = new File("hello.txt"); //2.FileReader流的例項化 fr = new FileReader(file); //3.讀入的操作 //read(char[] cbuf):返回每次讀入cbuf陣列中的字元的個數。如果達到檔案末尾,返回-1 char[] cbuf = new char[5]; int len; while ((len = fr.read(cbuf)) != -1){ //方式一: //錯誤寫法 // for (int i = 0; i < cbuf.length; i++) { // System.out.print(cbuf[i]); // } //正確寫法 // for (int i = 0; i < len; i++) { // System.out.print(cbuf[i]); // } //方式二: //錯誤寫法:對應著方式一的錯誤寫法 // String str = new String(cbuf); // System.out.print(str); //正確寫法 String str = new String(cbuf, 0, len); System.out.print(str); } } catch (IOException e) { e.printStackTrace(); } finally { //4.資源的關閉 if (fr != null) { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
四、FileWriter的使用
從記憶體中寫出資料到硬碟的檔案裡
說明:
輸出操作,對應的File可以不存在的。並不會報異常
File對應的硬碟中的檔案如果不存在,在輸出的過程中,會自動建立此檔案。
File對應的硬碟中的檔案如果存在:
- 如果流使用的構造器是:FileWriter(file,false) / FileWriter(file):對原有檔案的覆蓋
- 如果流使用的構造器是:FileWriter(file,true):不會對原有檔案覆蓋,而是在原有檔案基礎上追加內容
測試程式碼:
@Test public void testFileWriter() { FileWriter fw = null; try { //1.提供File類的物件,指明寫出到的檔案 File file = new File("hello1.txt"); //2.提供FileWriter的物件,用於資料的寫出 fw = new FileWriter(file); //3.寫出的操作 fw.write("I have a dream!\n"); fw.write("You need to have a dream!"); } catch (IOException e) { e.printStackTrace(); } finally { if (fw != null) { //4.流資源的關閉 try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } } }
五、FileReader和FileWriter的測試
使用FileReader和FileWriter來實現文字檔案的讀入和寫出操作(相當於複製該檔案)
測試程式碼:
@Test
public void testFRFW() {
FileReader fr = null;
FileWriter fw = null;
try {
//1.建立File類物件,指明讀入和寫出的檔案
File srcFile = new File("hello.txt");
File destFile = new File("hello2.txt");
//2.建立輸入流和輸出流的物件
fr = new FileReader(srcFile);
fw = new FileWriter(destFile);
//3.資料的讀入和寫出操作
char[] cbuf = new char[5];
int len;
while ((len = fr.read(cbuf)) != -1){
fw.write(cbuf,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.關閉流資源
try {
if (fr != null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fw != null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}