Java中的IO流之字符流Reader和Writer
1. Reader流
Reader : 和InputStream的唯一的區(qū)別就在于讀的數(shù)據(jù)單位不同
繼承自Reader的流都是用于向程序中輸入數(shù)據(jù),且數(shù)據(jù)的單位為字符(16bit)
16位:一個(gè)字符也就是兩個(gè)字節(jié),使用Reader流讀取數(shù)據(jù)時(shí)都是兩個(gè)字節(jié)兩個(gè)字節(jié)往外讀的,為什么還要有這兩種兩個(gè)字節(jié)的讀取方式呢? 因?yàn)橛行┳址钦?個(gè)字節(jié)的,如我們的中文字符在Java里面就是占兩個(gè)字節(jié)的。如果采用一個(gè)字節(jié)一個(gè)字節(jié)往外讀的方式,那么讀出來的就是半個(gè)漢字,這樣子Java就沒有辦法正確的顯示中文字符的,所以有必要存在這種流,一個(gè)字符一個(gè)字符地往外讀。
Reader的基本方法:
//讀取一個(gè)字節(jié)并以整數(shù)的形式返回(0~255) //如果返回-1就說明已經(jīng)到了輸入流的末尾 int read() throws IOException //讀取一系列字節(jié)并存儲(chǔ)到一個(gè)數(shù)組buffer //返回實(shí)際讀取的字節(jié)數(shù),如果讀取前已到輸入流的末尾,則返回-1 int read(byte[] buffer) throws IOException //從offset位置開始,讀取length個(gè)字節(jié) 并存儲(chǔ)到一個(gè)字節(jié)數(shù)組buffer, //返回實(shí)際讀取的字節(jié)數(shù),如果讀取前以到輸入流的末尾返回-1. int read(byte[] buffer,int offset,int length) throws IOException //關(guān)閉流釋放內(nèi)存資源 void close() throws IOException //跳過n個(gè)字節(jié)不讀,返回實(shí)際跳過的字節(jié)數(shù) long skip(long n) throws IOException
2. Writer流
繼承自Writer的流都是用于程序中輸出數(shù)據(jù),且數(shù)據(jù)的單位為字符(16bit);
Writer的基本方法:
//向輸出流中寫入一個(gè)字節(jié)數(shù)據(jù),該字節(jié)數(shù)據(jù)為參數(shù)b的低16位 void write(int b) throws IOException //將一個(gè)字節(jié)類型的數(shù)組中的數(shù)據(jù)寫入輸出流 void write(byte[] b) throws IOException //將一個(gè)字節(jié)類型的數(shù)組中的從指定位置(off)開始的len個(gè)字節(jié)寫入到輸出流 void write(byte[] b,int off,int len) throws IOException //關(guān)閉流釋放內(nèi)存資源 void close() throws IOException //將輸出流中緩沖的數(shù)據(jù)全部寫出到目的地 void flush() throws IOException
【演示:使用FileWriter(字符流)向指定文件中寫入數(shù)據(jù)】:
read.txt
Hello Java!
Hello C!
Hello Python!
Hello C#!
write.txt
Test.java
package character1; import java.io.FileReader; import java.io.FileWriter; /*使用FileWriter(字符流)向指定文件中寫入數(shù)據(jù)寫入數(shù)據(jù)時(shí)以1個(gè)字符為單位進(jìn)行寫入*/ public class Test { public static void main(String[] args) { /*使用FileWriter輸出流從程序把數(shù)據(jù)寫入到write.txt文件中 使用FileWriter流向文件寫入數(shù)據(jù)時(shí)是一個(gè)字符一個(gè)字符寫入的*/ try (FileWriter fileWriter = new FileWriter("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\write.txt"); FileReader fileReader = new FileReader("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");) { /* 字符的本質(zhì)是一個(gè)無符號(hào)的16位整數(shù) 字符在計(jì)算機(jī)內(nèi)部占用2個(gè)字節(jié) 這里使用for循環(huán)把0~60000里面的所有整數(shù)都輸出 這里相當(dāng)于是把全世界各個(gè)國家的文字都以0~60000內(nèi)的整數(shù)的形式來表示 */ for (int i = 0; i < 60000; i++) { /* 使用write(int c)把0~60000內(nèi)的整數(shù)寫入到指定文件內(nèi) 調(diào)用write()方法時(shí),我認(rèn)為在執(zhí)行的過程中應(yīng)該使用了“(char)c”進(jìn)行強(qiáng)制 轉(zhuǎn)換, 即把整數(shù)轉(zhuǎn)換成字符來顯示 因?yàn)榇蜷_寫入數(shù)據(jù)的文件可以看到,里面顯示的數(shù)據(jù)并不是0~60000內(nèi)的整數(shù), 而是不同國家的文字的表示方式 */ fileWriter.write(i); } /*使用FileReader(字符流)讀取指定文件里面的內(nèi)容 讀取內(nèi)容時(shí)是以一個(gè)字符為單位進(jìn)行讀取的*/ int b = 0; long num = 0; while ((b = fileReader.read()) != -1) { System.out.print((char) b); num++; } System.out.println(); System.out.println("總共讀取了" + num + "個(gè)字符"); } catch (Exception e) { // 打印異常信息 e.printStackTrace(); // 異常退出 System.exit(-1); } } }
3. 小結(jié)
FileReader和FileWriter這兩個(gè)流都是字符流,都是以一個(gè)字符為單位進(jìn)行輸入和輸出的。所以讀取和寫入占用2個(gè)字節(jié)的字符時(shí)都可以正常地顯示出來,以上是以File(文件)這個(gè)類型為例對(duì)節(jié)點(diǎn)流進(jìn)行了講解,所謂的節(jié)點(diǎn)流指定就是直接把輸入流或輸出插入到數(shù)據(jù)源上,直接往數(shù)據(jù)源里面寫入數(shù)據(jù)或讀取數(shù)據(jù)。
到此這篇關(guān)于Java中的IO流之字符流Reader和Writer的文章就介紹到這了,更多相關(guān)Java字符流Reader和Writer內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Elasticsearch查詢及聚合類DSL語句寶典示例詳解
這篇文章主要為大家介紹了Elasticsearch查詢及聚合類DSL語句寶典示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01SpringBoot 集成JUnit5的詳細(xì)操作過程
JUnit5是最新的Java單元測(cè)試框架,提供了靈活的測(cè)試支持,它由JUnit Platform、JUnit Jupiter和JUnit Vintage組成,支持不同環(huán)境下的測(cè)試運(yùn)行,SpringBoot從2.2版本開始默認(rèn)支持JUnit5,本文介紹了SpringBoot 集成JUnit5的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2024-10-10Java多線程知識(shí)點(diǎn)全面總結(jié)
這篇文章主要介紹了Java多線程知識(shí)點(diǎn)全面總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐
本文主要介紹了Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08一篇文章帶你了解Maven的坐標(biāo)概念以及依賴管理
這篇文章主要為大家介紹了Maven的坐標(biāo)概念以及依賴管理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01