大家好,我是Java進(jìn)階者。
前言
本文主要學(xué)習(xí)字節(jié)緩沖流使用BufferedInputStream和BufferedOutputStream這兩個流的用法來實現(xiàn)文本拷貝、字符流、Reader類、Writer類這些的用法。接下來小編帶大家一起來學(xué)習(xí)這些用法!
一、字節(jié)緩沖流
1.在前面我們學(xué)習(xí)了BufferedInputStream和BufferedOutputStream類,這兩個類分別是FilterInputStream類和FilterOutputStream類的子類。它們的構(gòu)造方法分別接受InputStream和OutStream類型的參數(shù),在讀寫數(shù)據(jù)有一個緩沖的功能。
2.使用緩沖流來完成讀寫數(shù)據(jù),接下來通過一個案例使用BufferedInputStream和BufferedOutputStream這兩個流的用法來實現(xiàn)文本拷貝。實現(xiàn)例子如下所示:
(1)首先在text文件夾目錄下創(chuàng)建一個test11.txt并寫入"Hello,world~~~test!"內(nèi)容。
(2)實現(xiàn)文件的拷貝代碼如下所示:
- import java.io.*;
- public class P11 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //創(chuàng)建有緩沖區(qū)的輸入流和輸出流
- BufferedInputStream in = new BufferedInputStream(new FileInputStream("text/test11"));
- BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("text/test12"));
- int num;
- //判斷是否讀到文件的末尾
- while((num=in.read())!=-1){
- bos.write(num);
- }
- //關(guān)閉流
- in.close();
- bos.close();
- }
- }
運(yùn)行的結(jié)果如下所示:
在上面的代碼中,創(chuàng)建了BufferedInputStream和BufferedOutputStream兩個緩沖流對象,在這兩個流中內(nèi)部定義一個字節(jié)數(shù)組,當(dāng)調(diào)用read()方法或write()方法讀寫數(shù)據(jù),先將讀寫的數(shù)據(jù)存到字節(jié)數(shù)組,在把字節(jié)數(shù)組的數(shù)據(jù)一次性讀寫到文件中。
二、字符流
1.我們前面學(xué)過InputStream和OutputStream的輸入輸出操作都是基于字節(jié)的,字節(jié)流不能操作Unicode字符,我們知道漢字在文件是占2個字節(jié),若使用字節(jié)流讀取不當(dāng)會出現(xiàn)亂碼現(xiàn)象例如顯示一個正方形的框。使用字符流可以避免出現(xiàn)亂碼現(xiàn)象。
2.字符流有兩個抽象超類分別是Reader和Writer,Reader是字符輸入流,使用從某個源設(shè)備讀取字符,Writer是字符輸出流,用于向某個目標(biāo)設(shè)備寫入字符。
三、Reader類
1.java.io.Reader是字符輸入流的最頂層的父類,這個類定義了以字符為單位讀取數(shù)據(jù)的基本方法,并在子類進(jìn)行分化和實現(xiàn)。
2.Reader類方法有如下所示:
(1)public int read() throws IOException:讀取一個字符。在讀取流,如果沒有數(shù)據(jù)就會出現(xiàn)調(diào)用受阻的現(xiàn)象,程序會一直等待到有數(shù)據(jù)讀出為止。
(2)public int read(char cbuf[]) throws IOException:讀取多個字符到字符數(shù)組cbuf。
(3)public int read(char cbuf[],int off,int len) throws IOException:從off開始的位置中讀取len個字符存放到字符數(shù)組。off參數(shù)表示數(shù)組偏移量,len參數(shù)表示讀取數(shù)據(jù)的長度。
(4)public void mark(int readAheadLimit) throws IOException:在輸入流中設(shè)置標(biāo)記。
(5)public boolean markSupporter() throws IOException:測試輸入流是否支持mark()方法
(6)public void reset() throws IOException:重置流的當(dāng)前位置到前面標(biāo)記的位置。
(7)public void close() throws IOException:表示關(guān)閉流。
(8)public long skip(long n) throws IOException:略過流中的數(shù)據(jù)。若數(shù)據(jù)不夠,跳過僅有的字節(jié),返回跳過的字節(jié)數(shù)。
(9)public boolean ready():返回輸入流是否做好讀的準(zhǔn)備。
3.Reader類實例代碼如下所示:
(1)在text文件夾目錄下創(chuàng)建一個test13.txt文件并寫入"Hello,World!Java進(jìn)階學(xué)習(xí)交流!"。
(2)代碼實現(xiàn)的例子:
- public class P12 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //聲明File對象
- File f=new File("text/test13");
- Reader in=new FileReader(f);
- //所有的數(shù)據(jù)讀到數(shù)組c中
- char c[]=new char[1024];
- //讀取內(nèi)容
- int len=in.read(c);
- //關(guān)閉流
- in.close();
- System.out.println("內(nèi)容為:"+new String(c,0,len));
- }
- }
運(yùn)行的結(jié)果如下所示:
四、Writer類
1.Writer類是一個寫入字符流的抽象類。
2.Writer方法有如下所示:
(1)public void close() throws IOException方法:表示關(guān)閉流。
(2)public voir write(int c) throws IOException方法:表示寫入單個字符。
(3)public abstract void read(char cbuf[],int off,int len) throws IOException方法:向流中寫入一個數(shù)組,參數(shù)off指定數(shù)組的偏移量,len指定讀取數(shù)據(jù)的長度。
(4)public void write(String str) throws IOException方法:寫入一個字符串。
五、總結(jié)
本文主要介紹了字節(jié)緩沖流、字符流、Reader類、Writer類。字節(jié)緩沖流是使用BufferedInputStream和BufferedOutputStream這兩個流的用法來實現(xiàn)文本拷貝。字符流有兩個抽象超類分別是Reader和Writer,Reader是字符輸入流,使用從某個源設(shè)備讀取字符,Writer是字符輸出流,用于向某個目標(biāo)設(shè)備寫入字符。介紹了Reader類的方法,通過Reader類實例來實現(xiàn)讀取文本文件內(nèi)容,Writer類是一個寫入字符流的抽象類。希望大家通過本文的學(xué)習(xí),對你有所幫助!
我是Java進(jìn)階者,希望大家通過本文的學(xué)習(xí),對你有所幫助!歡迎大家加我微信,有問題可以隨時幫大家解決噢,交個朋友也好哇~
原文鏈接:https://mp.weixin.qq.com/s/O4KJ9jS1AqVnVSVTWLM7vQ