<menuitem id="r3jhr"></menuitem><noscript id="r3jhr"><progress id="r3jhr"><code id="r3jhr"></code></progress></noscript>

      java io流學(xué)習(xí)總結(jié)

      時間:2024-09-30 12:53:17 學(xué)習(xí)總結(jié) 我要投稿
      • 相關(guān)推薦

      java io流學(xué)習(xí)總結(jié)

        一、什么是流?

      java io流學(xué)習(xí)總結(jié)

        流就是字節(jié)序列的抽象概念,能被連續(xù)讀取數(shù)據(jù)的數(shù)據(jù)源和能被連續(xù)寫入數(shù)據(jù)的接收端就是流,流機制是Java及C++中的一個重要機制,通過流我們可以自由地控制文件、內(nèi)存、IO設(shè)備等數(shù)據(jù)的流向。而IO流就是用于處理設(shè)備上的數(shù)據(jù),如:硬盤、內(nèi)存、鍵盤錄入等。IO流根據(jù)處理類型的不同可分為字節(jié)流和字符流,根據(jù)流向的不同可分為輸入流和輸出流。

        二、字節(jié)流和字符流的區(qū)別:

        字符流,因為文件編碼的不同,就有了對字符進行高效操作的字符流對象,它的原理就是基于字節(jié)流讀取字節(jié)時去查了指定的碼表。它和字節(jié)流的區(qū)別有兩點:1.在讀取數(shù)據(jù)的時候,字節(jié)流讀到一個字節(jié)就返回一個字節(jié),字符流使用了字節(jié)流讀到一個或多個字節(jié)(一個中文對應(yīng)的字節(jié)數(shù)是兩個,在UTF-8碼表中是3個字節(jié))時,先去查指定的編碼表,再將查到的字符返回;2.字節(jié)流可以處理所有類型的數(shù)據(jù),如jpg、avi、mp3、wav等等,而字符流只能處理字符數(shù)據(jù)。所以可以根據(jù)處理的文件不同考慮使用字節(jié)流還是字符流,如果是純文本數(shù)據(jù)可以優(yōu)先考慮字符流,否則使用字節(jié)流。

        三、IO體系,所具備的基本功能就是讀和寫:

        1.字符流

        |-- Reader(讀)

        |-- Writer(寫)

        Reader

        |--InputStreamReader

        |--FileReader:用于處理文件的字符讀取流對象

        Writer

        |--OutputStreamWriter

        |--FileWriter:用于處理文件的字符寫入流對象

        其實很容易就可以看出來,IO體系中的子類名后綴絕大部分是父類名稱,而前綴則是體現(xiàn)子類特有功能的名稱。

        Reader中常見的方法:

        |--int read()

        讀取一個字符,并返回讀到的這個字符,讀到流的末尾則返回-1。

        |--int read(char[])

        將讀到的字符存入指定的數(shù)組中,返回的是讀到的字符個數(shù),

        讀到流的末尾則返回-1。

        |--close()

        讀取字符其實用的是window系統(tǒng)的功能,就希望使用完畢后,

        進行資源的釋放。

        FileReader除了自己的構(gòu)造函數(shù)外沒有特有的方法:

        |--用于讀取文本文件的流對象。

        |--用于關(guān)聯(lián)文本文件。

        |--構(gòu)造函數(shù)FileReader(String fileName)

        在讀取流對象初始化時,必須要指定一個被讀取的文件,

        如果該文件不存在則會發(fā)生FileNotFoundException異常。

        Writer中常見的方法:

        |--write()

        將一個字符寫入到流中。

        |--write(char[])

        將一個字符數(shù)組寫入到流中。

        |--writer(String)

        將一個字符寫入到流中。

        |--flush()

        刷新流,將流中的數(shù)據(jù)刷新到目的地中,流還存在。

        |--close()

        關(guān)閉資源,在關(guān)閉錢會先調(diào)用flush(), 刷新流中的數(shù)據(jù)到目的地。

        FileWriter,除了自己的構(gòu)造函數(shù)外沒有特有的方法:

        |--該類的特點

        |--用于處理文本文件

        |--沒有默認(rèn)的編碼表

        |--有臨時緩沖

        |--構(gòu)造函數(shù),在寫入流對象初始化時,必須要有一個存儲數(shù)據(jù)的目的地。

        |--FileWriter(String fileName),該構(gòu)造器是干什么用的呢?

        |--調(diào)用系統(tǒng)資源

        |--在指定位置創(chuàng)建一個文件,如果該文件已經(jīng)存在則被覆蓋。

        |--FileWriter(String filename,Boolean append),這構(gòu)造器的作用是?

        當(dāng)傳入的boolean類型的值為true時,會在指定文件末尾處進行數(shù)據(jù)的續(xù)寫。

        清單1,將文本數(shù)據(jù)保存到文件中代碼

        private static void test1(){

        FileWriter fw=null;

        try {

        //初始化FileWriter對象,指定文件名已經(jīng)存儲路徑

        fw=new FileWriter("D:/test.txt");

        fw.write("將字符串寫入流");

        //將流中的數(shù)據(jù)刷新到目的地,流還在

        fw.flush();

        fw.write("將字符串寫入流");

        } catch (IOException e) {

        e.printStackTrace();

        }finally{

        if(fw!=null){

        try {

        fw.close();

        } catch (IOException e1) {

        e1.printStackTrace();

        }

        }

        }

        }

        清單2,讀取一個已有文本文件,并將文本內(nèi)容打印出來代碼

        private static void test2(){

        FileReader fr=null;

        try {

        //初始化FileReader對象,指定文件路徑

        fr=new FileReader("D:/test.txt");

        int ch=0;

        while((ch=fr.read())!=-1){

        //每次讀取一個字符,直到讀到末尾-1為止

        System.out.println((char)ch);

        }

        } catch (IOException e) {

        e.printStackTrace();

        }finally{

        if(fr!=null){

        try {

        fr.close();

        } catch (IOException e1) {

        e1.printStackTrace();

        }

        }

        }

        }

        這樣每讀到一個字符就打印出來,效率很不高,能不能按指定大小讀取完后再打印出來呢?答案是當(dāng)然可以的。

        清單3,讀取一個已有文本文件,讀完1kb再將其讀到的內(nèi)容打印出來代碼

        private static void test3(){

        FileReader fr=null;

        try {

        //初始化FileReader對象,指定文件路徑

        fr=new FileReader("D:/test.txt");

        char[] buf=new char[1024];

        int len=0;

        while((len=fr.read(buf))!=-1){

        //每次讀取1kb大小的字符,直到讀到末尾-1為止

        System.out.println(new String(buf,0,len));

        }

        } catch (IOException e) {

        e.printStackTrace();

        }finally{

        if(fr!=null){

        try {

        fr.close();

        } catch (IOException e1) {

        e1.printStackTrace();

        }

        }

        }

        }

        字符流的緩沖區(qū):

        |--緩沖區(qū)的出現(xiàn)提高了對流的操作效率。

        原理:其實就是將數(shù)組進行封裝。

        |--對應(yīng)的對象

        |--BufferedWriter

        特有方法newLine(),跨平臺的換行符。

        |--BufferedReader

        特有方法readLine(),一次讀一行,到行標(biāo)記時,將行標(biāo)記

        之前的字符數(shù)據(jù)作為字符串返回,讀到末尾返回null。

        |--說明

        在使用緩沖區(qū)對象時,要明確,緩沖的存在是為了增強流

        的功能而存在,所以在建立緩沖區(qū)對象時,要先有流對象

        存在。其實緩沖區(qū)內(nèi)部就是在使用流對象的方法,只不過

        加入了數(shù)組對數(shù)據(jù)進行了臨時存儲,為了提高操作數(shù)據(jù)的

        效率。

        |--代碼上的體現(xiàn)

        |--寫入緩沖區(qū)對象

        根據(jù)前面所說的建立緩沖區(qū)時要先有流對象,并將其作為參數(shù)傳遞給緩沖區(qū)的構(gòu)造函數(shù)

        BufferedWriter bufw=new BufferedWriter(new FileWriter(“test.txt”));

        bufw.write(“將數(shù)據(jù)寫入緩沖區(qū)”);

        bufw.flush();//將緩沖區(qū)的數(shù)據(jù)刷新到目的地

        bufw.close();//其實關(guān)閉的是被包裝在內(nèi)部的流對象

        |--讀取緩沖區(qū)對象

        BufferedReader bufr=new BufferedReader(new FileReader(“test.txt”));

        String line=null;

        while((line=bufr.readLine())!=null){

        //每次讀取一行,取出的數(shù)據(jù)不包含回車符

        system.out.println(line);

        }

        bufr.close();

        清單4,使用緩沖區(qū)對文本文件進行拷貝代碼

        private static void test4(){

        BufferedReader bufr=null;

        BufferedWriter bufw=null;

        try {

        bufr=new BufferedReader(new FileReader("D:/a.txt"));

        bufw=new BufferedWriter(new FileWriter("D:/b.txt"));

        String line=null;

        while((line=bufr.readLine())!=null){

        bufw.write(line);//每次將一行寫入緩沖區(qū)

        bufw.flush();//刷新到目的地

        }

        } catch (IOException e) {

        e.printStackTrace();

        }finally{

        try {

        if(bufw!=null){

        bufw.close();

        }

        if(bufr!=null){

        bufr.close();

        }

        } catch (IOException e1) {

        e1.printStackTrace();

        }

        }

        }

        仔細(xì)看可以發(fā)現(xiàn),程序里面的FileReader對象和FileWriter對象直接new出來且沒有調(diào)用close(),因為緩沖對象調(diào)用了這兩個方法,前面說了,緩沖對象調(diào)用的flush()和close()其實就是關(guān)閉被包裝在其內(nèi)部的流對象。關(guān)閉流的先后順序也要注意,如果流之間有依賴關(guān)系,則被依賴的流要后關(guān)閉。readLine()方法原理:其實緩沖區(qū)中的該方法,用的還是與緩沖區(qū)關(guān)聯(lián)的流對象的read方法,只不過,每一次讀到一個字符先不進行具體操作,先進行臨時存儲,當(dāng)讀到回車標(biāo)記時,將臨時容器中存儲的數(shù)據(jù)一次性返回。我們可以根據(jù)這個原理來自己編寫一個緩沖區(qū)對象。

        清單5,編寫一個自己的bufferedreader代碼

        public class MyBufferedReader {

        private Reader reader;

        public MyBufferedReader(Reader reader){

        this.reader=reader;

        }

        public String readLine() throws IOException{

        StringBuilder sb=new StringBuilder();

        int ch=0;

        while((ch=reader.read())!=-1){

        if(ch=='\r'){//空格則繼續(xù)

        continue;

        }else if(ch=='\n'){//每次返回一行

        return sb.toString();

        }else{

        sb.append((char)ch);

        }

        }

        return sb.toString();

        }

        public void close() throws IOException{

        //緩沖對象的關(guān)閉方法其實就是調(diào)用流本身的close()

        reader.close();

        }

        }

        測試時把清單4的BufferedReader對象替換成MyBufferedReader對象即可。

        清單6,測試mybufferedreader代碼

        private static void test4(){

        MyBufferedReader bufr=null;

        BufferedWriter bufw=null;

        try {

        bufr=new MyBufferedReader(new FileReader("D:/a.txt"));

        bufw=new BufferedWriter(new FileWriter("D:/b.txt"));

        String line=null;

        while((line=bufr.readLine())!=null){

        bufw.write(line);//每次將一行寫入緩沖區(qū)

        bufw.flush();//刷新到目的地

        }

        } catch (IOException e) {

        e.printStackTrace();

        }finally{

        try {

        if(bufw!=null){

        bufw.close();

        }

        if(bufr!=null){

        bufr.close();

        }

        } catch (IOException e1) {

        e1.printStackTrace();

        }

        }

        }

        其實我們自己寫的這個緩存對象就是對Reader對象進行了功能的增強,Reader對象每次只能返回一個字符,而增強了功能之后該類就可以每次返回一行字符,也就是設(shè)計模式中所說的裝飾模式。

      【java io流學(xué)習(xí)總結(jié)】相關(guān)文章:

      java工作總結(jié)03-23

      JAVA試用期工作總結(jié)02-20

      java工程師工作總結(jié)04-10

      java年終工作總結(jié)05-07

      java程序員轉(zhuǎn)正工作總結(jié)05-10

      Java實習(xí)報告范文03-22

      JAVA轉(zhuǎn)正申請書02-02

      JAVA工程求職信03-19

      java個人年終工作總結(jié)05-19

      久久亚洲中文字幕精品一区四_久久亚洲精品无码av大香_天天爽夜夜爽性能视频_国产精品福利自产拍在线观看
      <menuitem id="r3jhr"></menuitem><noscript id="r3jhr"><progress id="r3jhr"><code id="r3jhr"></code></progress></noscript>
        在线免费看片一区二区 | 亚洲一级在线爱潮 | 免费国产a深夜影院 | 亚洲人色大成年网站在线观看 | 性做久久久久久久久 | 日本久久道色综合久久 |