文件的拷貝、字節(jié)流的緩沖區(qū)、BufferedInputStream類
前言
本文主要學(xué)習(xí)文件的拷貝、字節(jié)流的緩沖區(qū)、BufferedInputStream類。讀取文件如果一個(gè)一個(gè)的讀寫,這樣的操作文件效率太低,通過(guò)學(xué)習(xí)字節(jié)流的緩沖區(qū)通過(guò)一個(gè)字節(jié)數(shù)組來(lái)讀取多個(gè)字節(jié)的數(shù)據(jù),再把字節(jié)數(shù)組的數(shù)據(jù)一次性的寫入文件中。接下來(lái)小編帶大家一起來(lái)學(xué)習(xí)!
一、文件的拷貝
1.文件的拷貝是通過(guò)輸入流來(lái)讀取文件的數(shù)據(jù),通過(guò)輸出流把數(shù)據(jù)寫入文件。怎么進(jìn)行文件復(fù)制的呢?使用FileInputStream類與FileOutputStream類復(fù)制文件。
2.首先在text文件夾下創(chuàng)建一個(gè)test06.txt文件,并寫入內(nèi)容為“Java進(jìn)階學(xué)習(xí)交流001、Java進(jìn)階學(xué)習(xí)交流002、Java進(jìn)階學(xué)習(xí)交流003”,如下圖所示:
3.代碼實(shí)現(xiàn)文件的拷貝如下所示:
- import java.io.*;
- public class P06 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //創(chuàng)建一個(gè)字節(jié)輸入流,讀取text文件夾下test06.txt數(shù)據(jù)
- InputStream in = new FileInputStream("text/test06");
- //創(chuàng)建一個(gè)字節(jié)輸出流,用來(lái)讀取數(shù)據(jù)并在text文件夾下創(chuàng)建一個(gè)test07.txt文件
- OutputStream out = new FileOutputStream("text/test07");
- int num;//定義個(gè)int類型的變量num,保存每次讀取的一個(gè)字節(jié)
- //復(fù)制文件前的系統(tǒng)時(shí)間
- long startTime=System.currentTimeMillis();
- //while循環(huán)判斷讀取的一個(gè)字節(jié)是否讀到文件的末尾
- while((num=in.read())!=-1){
- //讀到的數(shù)據(jù)寫到文件中
- out.write(num);
- }
- //復(fù)制文件后的系統(tǒng)時(shí)間
- long endTime=System.currentTimeMillis();
- System.out.println("復(fù)制文件所使用的時(shí)間是:"+(endTime-startTime)+"毫秒");
- //關(guān)閉流
- in.close();
- out.close();
- }
- }
運(yùn)行的結(jié)果如下圖所示:
二、字節(jié)流的緩沖區(qū)
1.在實(shí)現(xiàn)文件拷貝時(shí),如果一個(gè)個(gè)字節(jié)來(lái)讀寫,經(jīng)常操作文件這樣的效率太低了。首先創(chuàng)建一個(gè)字節(jié)數(shù)組來(lái)保存一次性讀取多個(gè)字節(jié)的數(shù)據(jù),再把字節(jié)數(shù)組中的數(shù)據(jù)一次性寫入文件。這里的緩沖區(qū)相當(dāng)字節(jié)數(shù)組!
2.如何使用緩沖區(qū)拷貝文件?
(1)首先在text文件夾下創(chuàng)建一個(gè)test08.txt文件,并寫入內(nèi)容為“HelloWorld,Java程序設(shè)計(jì)001!、HelloWorld,Java程序設(shè)計(jì)002!、HelloWorld,Java程序設(shè)計(jì)003!、HelloWorld,Java程序設(shè)計(jì)004!、HelloWorld,Java程序設(shè)計(jì)005!、HelloWorld,Java程序設(shè)計(jì)006!”,如下圖所示:
(2)代碼如下所示:
- import java.io.*;
- public class P07 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //創(chuàng)建一個(gè)字節(jié)輸入流,讀取text文件夾下test08.txt數(shù)據(jù)
- InputStream in = new FileInputStream("text/test08");
- //創(chuàng)建一個(gè)字節(jié)輸出流,用來(lái)讀取數(shù)據(jù)并在text文件夾下創(chuàng)建一個(gè)test09.txt文件
- OutputStream out = new FileOutputStream("text/test09");
- //定義字節(jié)數(shù)組使用緩存區(qū)讀寫文件數(shù)據(jù)
- byte bt[]=new byte[1024];
- //定義一個(gè)int類型的變量num,保存讀取讀到緩沖區(qū)的字節(jié)數(shù)
- int num;
- //復(fù)制文件前的系統(tǒng)時(shí)間
- long startTime=System.currentTimeMillis();
- //while循環(huán)判斷讀取的字節(jié)是否讀到文件的末尾
- while((num=in.read(bt))!=-1){
- out.write(bt,0,num);
- }
- //復(fù)制文件后的系統(tǒng)時(shí)間
- long endTime=System.currentTimeMillis();
- System.out.println("復(fù)制文件所使用的時(shí)間是:"+(endTime-startTime)+"毫秒");
- //關(guān)閉流
- in.close();
- out.close();
- }
- }
運(yùn)行的結(jié)果如下圖所示:
上面代碼中主要實(shí)現(xiàn)了test08.txt文件的拷貝,拷貝過(guò)程中使用到了while循環(huán)將字節(jié)文件進(jìn)行拷貝,每循環(huán)一次在test08.txt文件中讀取很多個(gè)字節(jié)保存到數(shù)組中,通過(guò)變量num保存讀取的數(shù)組的字節(jié)數(shù),從數(shù)組的第一個(gè)字節(jié)開(kāi)始,把num個(gè)字節(jié)寫到文件中,當(dāng)num值為-1,讀取文件就結(jié)束了。最終實(shí)現(xiàn)了文件之間的拷貝是通過(guò)字節(jié)流的緩沖區(qū)。
三、BufferedInputStream類
1.BufferedInputStream是緩沖輸入流,可以減少訪問(wèn)磁盤的次數(shù),提高文件的讀取性能,它是FilterInputStream類的子類。
2.BufferedInputStream作用它相對(duì)于普通輸入流優(yōu)點(diǎn)是,它有一個(gè)緩沖數(shù)組,每次去調(diào)用read()方法,先從緩沖區(qū)讀取數(shù)據(jù),如果讀取數(shù)據(jù)失敗,從文件讀取新數(shù)據(jù)放到緩沖區(qū),再把緩沖區(qū)的內(nèi)容顯示出來(lái)。
3.如何用BufferedInputStream類讀取文本內(nèi)容?
(1)定義一個(gè)字節(jié)數(shù)組bt,再通過(guò)循環(huán)把文本內(nèi)容循環(huán)讀到bt中,再把讀取到的數(shù)據(jù)顯示出來(lái)。
(2)首先再text文件夾下創(chuàng)建一個(gè)test10.txt文件并寫入"Java進(jìn)階學(xué)習(xí)交流001!"的內(nèi)容。
(3)代碼的實(shí)現(xiàn):
- import java.io.*;
- public class P08 {
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- //創(chuàng)建一個(gè)帶有緩沖區(qū)的輸入流
- BufferedInputStream bi = new BufferedInputStream(new FileInputStream("text/test10"));
- //定義字節(jié)數(shù)組
- byte[] bt = new byte[1024];
- int num = 0;
- //判斷是否讀到文件的末尾
- while ((num = bi.read(bt)) != -1) {
- //讀取的字節(jié)轉(zhuǎn)為字符串對(duì)象
- String s = new String(bt, 0, num);
- System.out.println("讀取的內(nèi)容是:"+s);
- }
- //關(guān)閉流
- bi.close();
- }
- }
運(yùn)行的結(jié)果如下圖所示:
四、總結(jié)
本文主要介紹了文件的拷貝、字節(jié)流的緩沖區(qū)、BufferedInputStream類。文件的拷貝是輸入流來(lái)讀取文件的數(shù)據(jù),通過(guò)輸出流把數(shù)據(jù)寫入文件。字節(jié)流的緩沖區(qū)創(chuàng)建一個(gè)字節(jié)數(shù)組來(lái)保存一次性讀取多個(gè)字節(jié)的數(shù)據(jù),再把字節(jié)數(shù)組中的數(shù)據(jù)一次性寫入文件。BufferedInputStream是緩沖輸入流,可以減少訪問(wèn)磁盤的次數(shù),提高文件的讀取性能,它是FilterInputStream類的子類;它有一個(gè)緩沖數(shù)組,每次去調(diào)用read()方法,先從緩沖區(qū)讀取數(shù)據(jù),如果讀取數(shù)據(jù)失敗,從文件讀取新數(shù)據(jù)放到緩沖區(qū),再把緩沖區(qū)的內(nèi)容顯示出來(lái)。希望通過(guò)本文的學(xué)習(xí),對(duì)你有所幫助!
本文轉(zhuǎn)載自微信公眾號(hào)「Java進(jìn)階學(xué)習(xí)交流」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java進(jìn)階學(xué)習(xí)交流公眾號(hào)。