Java中的字符流FileReader與FileWriter詳解
概念
在Java中,使用Unicode約定存儲(chǔ)字符。字符流自動(dòng)允許我們逐字符讀/寫數(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類繼承而來(lái)。和文件相關(guān)的字符輸入流,可用于讀取文件數(shù)據(jù)。創(chuàng)建對(duì)象的時(shí)候,如果指定的文件不存在,將拋出異常。

相關(guān)方法和構(gòu)造器
FileReader提供了三個(gè)構(gòu)造器,用于實(shí)例化FileReader對(duì)象,根據(jù)不同的場(chǎng)景進(jìn)行選擇

- read():每次讀取單個(gè)字符,返回該字符,如果到文件末尾返回-1
public int read();
- read(char[]):批量讀取多個(gè)字符到數(shù)組,返回讀取到的字符數(shù),如果到文件末尾返回-1
public int read(char[] cbuf);
演示示例
使用FileReader從E盤下的hello.txt文本讀取內(nèi)容,并顯示
- read():?jiǎn)蝹€(gè)字符讀取文件(返回實(shí)際讀取到的字符數(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對(duì)象
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對(duì)象
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í)行完畢之后,會(huì)讀取到文本中相應(yīng)的內(nèi)容!
FileWriter字符輸出流
FileWriter 類從 OutputStreamWriter 類繼承而來(lái)。該類按字符向流中寫入數(shù)據(jù)。與FileOutputStream基本類似,只是前者是基于字符流后者是基于字節(jié)流。

相關(guān)方法和構(gòu)造器
FileWriter提供了五個(gè)構(gòu)造器,用于實(shí)例化FileWriter對(duì)象,根據(jù)不同的場(chǎng)景進(jìn)行選擇

- FileWriter(File file, boolean append);此構(gòu)造器為追加模式,當(dāng)append為true時(shí)追加到文件的末尾,否則覆蓋
- public void write(int c); 寫入單個(gè)字符
- public void write(char[] cbuf); 寫入指定數(shù)組
- public void write(char[] cbuf, int off, int len); 寫入指定數(shù)組指定的部分
- public void write(String str); 寫入整個(gè)字符串
- 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對(duì)象
FileWriter fileWriter = null;
char[] chars = {'a', 'b', 'c'};
try {
fileWriter = new FileWriter(filePath, true);
fileWriter.write('a');//寫入單個(gè)字符
fileWriter.write(chars);//寫入指定數(shù)組
fileWriter.write("hello,world".toCharArray(), 0, 5); //寫入字符數(shù)組的指定部分 寫入hello
fileWriter.write("Java");//寫入整個(gè)字符串
fileWriter.write("你好,世界",0,2);//寫入字符串的指定部分
} catch (IOException e) {
e.getMessage();//輸出異常l
} finally {
try {
fileWriter.close();//釋放資源
} catch (IOException e) {
e.getMessage();
}
}
}
此時(shí),上述代碼執(zhí)行之后,test.txt的內(nèi)容變成:aabchelloJava你好
在數(shù)據(jù)量大的情況下,可以使用循環(huán)操作!
為什么用完不close或flush,會(huì)寫入不到數(shù)據(jù)?
當(dāng)我們?cè)赾lose方法處進(jìn)行斷點(diǎn)進(jìn)行調(diào)試的時(shí)候,會(huì)發(fā)現(xiàn)FileWriter真正寫入數(shù)據(jù)的時(shí)候,是在close方法中!

一直下一步,真正添加數(shù)據(jù)是在這里

flush(刷新):方法同理,也會(huì)追加到這里
到此這篇關(guān)于Java中的字符流FileReader與FileWriter詳解的文章就介紹到這了,更多相關(guān)Java的FileWriter和FileReader內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA超級(jí)簡(jiǎn)單的爬蟲實(shí)例講解
下面小編就為大家?guī)?lái)一篇JAVA超級(jí)簡(jiǎn)單的爬蟲實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
HttpServletRequest參數(shù)丟失問(wèn)題及解決
在使用HttpServletRequest進(jìn)行參數(shù)傳遞時(shí),如果在異步方法中使用,可能會(huì)導(dǎo)致參數(shù)丟失,這是因?yàn)镠ttpServletRequest對(duì)象在異步任務(wù)中可能被回收,為了解決這個(gè)問(wèn)題,可以在異步方法中提前提取參數(shù),然后將其傳遞給異步任務(wù)2025-10-10
java實(shí)現(xiàn)響應(yīng)重定向發(fā)送post請(qǐng)求操作示例
這篇文章主要介紹了java實(shí)現(xiàn)響應(yīng)重定向發(fā)送post請(qǐng)求操作,結(jié)合實(shí)例形式分析了java請(qǐng)求響應(yīng)、重定向及數(shù)據(jù)處理相關(guān)操作技巧,需要的朋友可以參考下2020-04-04
Java字符串?dāng)?shù)組的創(chuàng)建代碼示例
這篇文章主要介紹了Java中字符串?dāng)?shù)組的聲明、初始化、默認(rèn)值、遍歷和常見操作,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-03-03
對(duì)SpringBoot項(xiàng)目配置文件進(jìn)行加密實(shí)現(xiàn)過(guò)程
文章介紹了如何在Spring Boot項(xiàng)目中使用Maven依賴和單元測(cè)試生成加密數(shù)據(jù),并將加密數(shù)據(jù)配置在`bootstrap.yml`或`application.yml`中,同時(shí),分享了如何在不同環(huán)境中配置加密鹽,包括IDE啟動(dòng)項(xiàng)、配置文件和Dockerfile2025-10-10

