posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          File & String 輸入輸出

          Posted on 2009-07-23 16:06 Gavin.lee 閱讀(1634) 評(píng)論(0)  編輯  收藏 所屬分類: Log && File Operate


          多靈活多變的功能是由它們的子類來(lái)擴(kuò)充完成的。知道了Java輸入輸出的基本層次結(jié)構(gòu)以后,本文在這里想給大家一些以后可以反復(fù)應(yīng)用例子,對(duì)于所有子類的細(xì)節(jié)及其功能并不詳細(xì)討論。

          import java.io.*;

          public class IOStreamDemo {

                public void samples() throws IOException {

                     //1. 這是從鍵盤讀入一行數(shù)據(jù),返回的是一個(gè)字符串
                     BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
                     System.out.print("Enter a line:");
                     System.out.println(stdin.readLine());

                     //2. 這是從文件中逐行讀入數(shù)據(jù)

                     BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
                     String s, s2 = new String();
                     while((s = in.readLine())!= null)
                                s2 += s + "\n";
                     in.close();


                     //3. 這是從一個(gè)字符串中逐個(gè)讀入字節(jié)
                     StringReader in1 = new StringReader(s2);
                     int c;
                     while((c = in1.read()) != -1)
                                System.out.print((char)c);


                     //4. 這是將一個(gè)字符串寫入文件
                     try {
                                BufferedReader in2 = new BufferedReader(new StringReader(s2));
                                PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
                                int lineCount = 1;
                                while((s = in2.readLine()) != null )
                                           out1.println(lineCount++ + ": " + s);
                                out1.close();
                     } catch(EOFException e) {
                                System.err.println("End of stream");
                     }
                }

          對(duì)于上面的例子,需要說(shuō)明的有以下幾點(diǎn):

            1. BufferedReader是Reader的一個(gè)子類,它具有緩沖的作用,避免了頻繁的從物理設(shè)備中讀取信息。它有以下兩個(gè)構(gòu)造函數(shù):

                  BufferedReader(Reader in) 
                  BufferedReader(Reader in, int sz) 

            這里的sz是指定緩沖區(qū)的大小。

            它的基本方法:

                       void close() //關(guān)閉流

                       void mark(int readAheadLimit) //標(biāo)記當(dāng)前位置

                       boolean markSupported() //是否支持標(biāo)記

                       int read() //繼承自Reader的基本方法

                       int read(char[] cbuf, int off, int len) //繼承自Reader的基本方法

                       String readLine() //讀取一行內(nèi)容并以字符串形式返回
           
                       boolean ready() //判斷流是否已經(jīng)做好讀入的準(zhǔn)備

                       void reset() //重設(shè)到最近的一個(gè)標(biāo)記

                       long skip(long n) //跳過(guò)指定個(gè)數(shù)的字符讀取

                  2. InputStreamReader是InputStream和Reader之間的橋梁,由于System.in是字節(jié)流,需要用它來(lái)包裝之后變?yōu)樽址鞴┙oBufferedReader使用。


            3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

            這句話體現(xiàn)了Java輸入輸出系統(tǒng)的一個(gè)特點(diǎn),為了達(dá)到某個(gè)目的,需要包裝好幾層。首先,輸出目的地是文件IODemo.out,所以最內(nèi)層包裝的是 FileWriter,建立一個(gè)輸出文

          件流,接下來(lái),我們希望這個(gè)流是緩沖的,所以用BufferedWriter來(lái)包裝它以達(dá)到目的,最后,我們需要格式化輸出結(jié)果,于是將PrintWriter包在最外層。


          Java提供了這樣一個(gè)功能,將標(biāo)準(zhǔn)的輸入輸出流轉(zhuǎn)向,也就是說(shuō),我們可以將某個(gè)其他的流設(shè)為標(biāo)準(zhǔn)輸入或輸出流,看下面這個(gè)例子:

          import java.io.*;

          public class Redirecting {

                 public static void main(String[] args) throws IOException {
                        PrintStream console = System.out;
                        BufferedInputStream in = new BufferedInputStream( new FileInputStream( "Redirecting.java"));
                        PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out")));
                        System.setIn(in);
                        System.setOut(out);

                        BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
                        String s;
                        while((s = br.readLine()) != null)
                               System.out.println(s);
                        out.close();
                        System.setOut(console);
                }
          }
           

            在這里java.lang.System的靜態(tài)方法

                      static void setIn(InputStream in) 
                      static void setOut(PrintStream out) 

            提供了重新定義標(biāo)準(zhǔn)輸入輸出流的方法,這樣做是很方便的,比如一個(gè)程序的結(jié)果有很多,有時(shí)候甚至要翻頁(yè)顯示,這樣不便于觀看結(jié)果,這是你就可以將標(biāo)準(zhǔn)輸出流定義為

          一個(gè)文件流,程序運(yùn)行完之后打開(kāi)相應(yīng)的文件觀看結(jié)果,就直觀了許多。

          主站蜘蛛池模板: 宾阳县| 旬阳县| 兰坪| 延津县| 东乌珠穆沁旗| 庆元县| 静乐县| 平顶山市| 福鼎市| 茶陵县| 伊春市| 扬中市| 常德市| 玉林市| 介休市| 化德县| 辽源市| 前郭尔| 曲靖市| 高雄县| 九寨沟县| 永寿县| 麻栗坡县| 盐津县| 日喀则市| 武功县| 庆安县| 赞皇县| 儋州市| 永和县| 措勤县| 舒城县| 阿荣旗| 浦东新区| 甘南县| 宜城市| 韩城市| 论坛| 会同县| 璧山县| 安新县|