Java中的字符流FileReader與FileWriter詳解
概念
在Java中,使用Unicode約定存儲字符。字符流自動允許我們逐字符讀/寫數(shù)據(jù),有助于執(zhí)行16位Unicode的輸入和輸出;它是以reader和writer結(jié)尾的。
在內(nèi)部,F(xiàn)ileReader使用FileInputStream;
同樣,F(xiàn)ileWrite使用FileOutputStream,字符流采用Unicode編碼。
FileReader字符輸入流
Reader :字符輸入流,用于讀取字符流的抽象超類。
FileReader類從InputStreamReader類繼承而來。和文件相關(guān)的字符輸入流,可用于讀取文件數(shù)據(jù)。創(chuàng)建對象的時候,如果指定的文件不存在,將拋出異常。
相關(guān)方法和構(gòu)造器
FileReader提供了三個構(gòu)造器,用于實例化FileReader對象,根據(jù)不同的場景進行選擇
- read():每次讀取單個字符,返回該字符,如果到文件末尾返回-1
public int read();
- read(char[]):批量讀取多個字符到數(shù)組,返回讀取到的字符數(shù),如果到文件末尾返回-1
public int read(char[] cbuf);
演示示例
使用FileReader從E盤下的hello.txt文本讀取內(nèi)容,并顯示
- read():單個字符讀取文件(返回實際讀取到的字符數(shù))
import org.junit.jupiter.api.Test; import java.io.FileReader; import java.io.IOException; @Test public void readFile01(){ String filePath = "E:\\test.txt"; FileReader fileReader = null;//創(chuàng)建FileReader對象 int data; try { fileReader= new FileReader(filePath); //循環(huán)讀取 while ((data = fileReader.read())!=-1){ System.out.print((char) data); } } catch (IOException e) { e.getMessage(); }finally { if (fileReader!=null){ try { fileReader.close();//釋放內(nèi)存 } catch (IOException e) { e.getMessage(); } } } }
- read(Char[] cbuf) 使用字符數(shù)組讀取文件 這里使用了String的構(gòu)造器用于將buf轉(zhuǎn)換為字符串
@Test public void readFile02() { String filePath = "E:\\test.txt"; FileReader fileReader = null;//創(chuàng)建FileReader對象 int readLen = 0; char[] buf = new char[8]; try { fileReader = new FileReader(filePath); // while ((readLen = fileReader.read(buf)) != -1) { System.out.print(new String(buf, 0, readLen)); } } catch (IOException e) { e.getMessage(); } finally { if (fileReader != null) { try { fileReader.close();//釋放內(nèi)存 } catch (IOException e) { e.getMessage(); } } } }
執(zhí)行完畢之后,會讀取到文本中相應(yīng)的內(nèi)容!
FileWriter字符輸出流
FileWriter 類從 OutputStreamWriter 類繼承而來。該類按字符向流中寫入數(shù)據(jù)。與FileOutputStream基本類似,只是前者是基于字符流后者是基于字節(jié)流。
相關(guān)方法和構(gòu)造器
FileWriter提供了五個構(gòu)造器,用于實例化FileWriter對象,根據(jù)不同的場景進行選擇
- FileWriter(File file, boolean append);此構(gòu)造器為追加模式,當(dāng)append為true時追加到文件的末尾,否則覆蓋
- public void write(int c); 寫入單個字符
- public void write(char[] cbuf); 寫入指定數(shù)組
- public void write(char[] cbuf, int off, int len); 寫入指定數(shù)組指定的部分
- public void write(String str); 寫入整個字符串
- public void write(String str, int off, int len); 寫入字符串的指定部分
注意:FileWriter使用后,必須關(guān)閉(close)或刷新(flush),否則寫入不到指定的文件(還在內(nèi)存里面)!
演示示例(使用的是追加構(gòu)造器)
將文本內(nèi)容輸出到E盤的test.txt文件 這里使用了Stirng類中的toCharArray方法:將字符串轉(zhuǎn)換成字符數(shù)組
import org.junit.jupiter.api.Test; import java.io.FileWriter; import java.io.IOException; @Test public void WriteFile02() { String filePath = "E:\\test.txt";//操作的文件路徑 //創(chuàng)建FileWrite對象 FileWriter fileWriter = null; char[] chars = {'a', 'b', 'c'}; try { fileWriter = new FileWriter(filePath, true); fileWriter.write('a');//寫入單個字符 fileWriter.write(chars);//寫入指定數(shù)組 fileWriter.write("hello,world".toCharArray(), 0, 5); //寫入字符數(shù)組的指定部分 寫入hello fileWriter.write("Java");//寫入整個字符串 fileWriter.write("你好,世界",0,2);//寫入字符串的指定部分 } catch (IOException e) { e.getMessage();//輸出異常l } finally { try { fileWriter.close();//釋放資源 } catch (IOException e) { e.getMessage(); } } }
此時,上述代碼執(zhí)行之后,test.txt的內(nèi)容變成:aabchelloJava你好
在數(shù)據(jù)量大的情況下,可以使用循環(huán)操作!
為什么用完不close或flush,會寫入不到數(shù)據(jù)?
當(dāng)我們在close方法處進行斷點進行調(diào)試的時候,會發(fā)現(xiàn)FileWriter真正寫入數(shù)據(jù)的時候,是在close方法中!
一直下一步,真正添加數(shù)據(jù)是在這里
flush(刷新):方法同理,也會追加到這里
到此這篇關(guān)于Java中的字符流FileReader與FileWriter詳解的文章就介紹到這了,更多相關(guān)Java的FileWriter和FileReader內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法
這篇文章主要介紹了SpringBoot接口請求入?yún)⒑统鰠⒃鰪姷奈宸N方法,使用`@JsonSerialize`和`@JsonDeserialize`注解,全局配置Jackson的`ObjectMapper`,使用`@ControllerAdvice`配合`@InitBinder`,自定義HttpMessageConverter和使用AOP進行切面編程,需要的朋友可以參考下2024-07-07java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):棧
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對廣大的程序愛好者有所幫助,同時祝大家有一個好成績,需要的朋友可以參考下,希望能給你帶來幫助2021-07-07Java中EasyPoi多sheet導(dǎo)出功能實現(xiàn)
這篇文章主要介紹了Java中EasyPoi多sheet導(dǎo)出功能實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況詳析
當(dāng)產(chǎn)生異常后,并在異常處理器中進行執(zhí)行之后,程序會是如何的一種狀態(tài),是終止還是繼續(xù)執(zhí)行處理之后的代碼呢,下面這篇文章主要給大家介紹了關(guān)于JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況的相關(guān)資料,需要的朋友可以參考下2024-05-05java中申請不定長度數(shù)組ArrayList的方法
今天小編就為大家分享一篇java中申請不定長度數(shù)組ArrayList的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07