天天看點

IO流的操作規律

流的操作規律

之是以要弄清楚這個規律,是因為流對象太多,開發時不知道用哪個對象合适.

想知道開發時用到哪些對象,隻要通過四個明确即可

1.明确源和目的

源:inputstream reader

目的:outputstream writer

2.明确資料是否是純文字資料.

源: 是純文字  reader

否  inputstream

目的: 是純文字  writer

否  outputstream

到這裡,就可以明确需求中具體要使用哪個 體系了

3.明确具體的裝置

源裝置:

硬碟: file

鍵盤: system.in

記憶體:數組

網絡:socket流

目的裝置:

控制台: system.out

4.是否需要其他額外功能

a.是否需要高效(緩沖區)

是,就加上buffer

b.轉換流  inputstreamreader outputstreamwriter

需求1:複制一個文本檔案

a.明确源和目的

  源:inputstream reader

  目的: outputstream writer

b.是否是純文字

 是,源:reader

  目的:writer

c.明确具體裝置

源:硬碟  file

目的:硬碟 file

filereader fr = new filereader("a.txt");

filewriter fw = new filewriter("b.txt");

d.需要額外功能

需要,高效,

bufferedreader buff = 

new bufferedreader(fr);

bufferedwriter bufw = new bufferedwriter(fw);

import java.io.bufferedreader;  

import java.io.bufferedwriter;  

import java.io.filereader;  

import java.io.filewriter;  

import java.io.ioexception;  

public class bufferedcopy {  

   public static void main(string[] args)throws ioexception {  

      //建立bufferedreader一樣,必須先有流。  

      filereader fr = new filereader("tempfile\\buf.txt");  

      bufferedreader bufr = new bufferedreader(fr);  

      //建立一個字元寫入流的緩沖區。應該先建立流。  

       filewriter fw = new filewriter("tempfile\\buf2.txt");  

      bufferedwriter bufw = new bufferedwriter(fw);  

      string line = null;  

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

         bufw.write(line);  

//       換行  

         bufw.newline();  

         bufw.flush();  

      }  

      bufr.close();  

      bufw.close();  

   }  

}     

需求2:讀取鍵盤錄入資訊,并寫入到文本檔案中

源:鍵盤  system.in

inputstream in = system.in;//位元組流,使用inputstreamreader

這樣做可以完成,但是麻煩,将讀取的位元組資料轉成字元串,再由字元流操作

轉換.将位元組流圍成字元流,因為明确的源是reader,這樣操作友善資料時,便捷.是以要将已有的位元組流轉成字元流.使用位元組-->字元  使用inputstreamreader

inputstreamreader isr = 

new inputstreamreader(system.in);

new bufferedreader(isr);

import java.io.inputstreamreader;  

public class readkeydemo {  

   public static void main(string[] args) throws ioexception {  

       bufferedreader bufr = new bufferedreader(new inputstreamreader(system.in));//記住:以後讀取鍵盤都用這句,可以背下來。  

       bufferedwriter bufw = new bufferedwriter(new filewriter("d:/a.txt"));  

       string line = null;  

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

            //如果輸入over,程式結束  

            if("over".equals(line))  

            {  

                break;  

            }  

            bufw.write(line);  

//          換行  

            bufw.newline();  

            bufw.flush();  

         }  

         bufr.close();  

         bufw.close();  

}  

需求3:将一個檔案檔案内容顯示在控制台上

 是,

 源:reader

 目的:writer

    c.明确具體裝置

    源:硬碟:file

    目的:控制台:system.out

    filereader fr = new filereader("a.txt");

    outputstream out = system.out;//這樣輸出内容很麻煩,使用轉換流

    d.需要額外功能嗎?

    需要:

    轉換流

    filereader fr = new new filereader("a.txt");

    outputstreamwriter osw = new outputstreamwriter(system.out);

    高效,buffer

    bufferedreader bufr = new bufferedreader(new filereader("a.txt"));

    bufferedwriter bufw = new bufferedwriter(new outputstreamwriter(system.out));

import java.io.outputstreamwriter;  

      bufferedreader bufr = new bufferedreader(new filereader("d:/a.txt"));  

      bufferedwriter bufw = new bufferedwriter(new outputstreamwriter(system.out));  

需求4:讀取鍵盤錄入資料,顯示在控制台上

    源:鍵盤:system.in

    inputstream in = system.in;

    outputstream out = system.out;

    d.明确額外功能?

    需要轉換,因為都是位元組流,但是操作的卻是文本資料

    是以使用字元流操作起來更為便捷

    inputstreamreader isr = 

    new inputstreamreader(system.in);

    outputstreamwriter osw = 

    new outputstreamwriter(system.out);

    為了将其高效

    bufferedreader bufr = new bufferedreader(isr);

    bufferedwriter bufw = new bufferedwriter(osw);

/** 

錄入鍵盤輸入字母并将小寫變為大寫 

*/  

import java.io.*;  

class readin   

{  

    public static void main(string[] args)throws ioexception   

    {  

        inputstream in = system.in;//引入輸入流  

        inputstreamreader isr = new inputstreamreader(in);  

        stringbuilder sb = new stringbuilder();//建立一個緩沖區  

        while(true)  

        {  

            int ch = in.read();//讀入鍵盤輸入  

            if(ch=='\r')  

                continue;  

            if(ch=='\n')  

                string s = sb.tostring();//講讀入輸入轉換為字元型  

                if("over".equals(s))//判斷s是否為over  

                    break;  

                else  

                    system.out.println(s.touppercase());//列印出字母大寫  

                sb.delete(0,sb.length());  

            else  

                sb.append((char)ch);  

        }  

    }  

什麼時候使用轉換流呢?

  1.源或者目的對應的裝置是位元組流,但是操作的卻是文本資料,可以使用轉換作為橋梁,提高對文本操作的便捷.

  2.一旦操作文本涉及到具體的指定編碼表時,必須使用轉換流

轉載:http://blog.csdn.net/chaoyu168/article/details/49663881