java編程思想 第十八章 字符流

import java.io.*;
import java.util.Arrays;

public class Ans {
    public static void main(String[] args) throws IOException {
        //test1();
       // test2();
        //test3();
        test4();
    }

    static void test0() throws IOException {
        //字符流是java 1.1中引入的新IO類,用以改進之前的字節流,增加了國際標準支持Unicode
        BufferedReader fr = new BufferedReader(new FileReader("test"));
        BufferedReader sr = new BufferedReader(new StringReader("test\nasad"));
        System.out.println(sr.readLine());
        //注意雖然BufferedInputStream是實現了FilterInputStream,但是BufferReader並不是來自FilterReader,主要原因或許是BufferReader不需要使用FilterReader提供的特性,而是需要自己的特性,因此在製作新IO時就將這兩個分開了,而目前FilterReader的子類只有PushbackReader。
        System.out.println(fr.readLine());

        File path = new File("test");
        System.out.println(path.length());
        FileReader f = new FileReader("test");
        BufferedReader fr2 = new BufferedReader(f);
        BufferedReader fr3 = new BufferedReader(fr2);

        char []all = new char[(int)path.length()];
        all[all.length-1] = '$';
        f.read();                                                   //如果裝飾器中的一環使用了read,readline後面的都會被影響,所以當沒有把握的時候最好因此創建完所有的裝飾,不要留下其他局部變量,否則容易造成奇怪的問題

        System.out.println(f.read(all));
        System.out.println(Arrays.toString(all));
        all = new char[(int)path.length()];                         //另外,如果在相應位置沒有讀入數據,則不會修改當前的這個字符,這樣很容易造成誤解,以爲讀入了數據,比如如果註釋掉這一行和下一行就會引起這樣的誤會
        all[all.length-1] = '$';
        fr2.read(all);
        System.out.println(Arrays.toString(all));
        all = new char[(int)path.length()];
        all[all.length-1] = '$';
        fr3.read(all);
        System.out.println(Arrays.toString(all));
    }

    static void test1() throws IOException {
        String s = "adfafafadaaf";
        ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
        DataInputStream dis = new DataInputStream(bais);                                //我們可以用DataInputStream來包裝ByteArrayInputStream
        while (dis.available()!=0)                                                      //在使用ByteArrayInputStream時所有字符都會正常返回,所以只能用available判斷還有多少個可讀字符
            System.out.print((char)dis.read());                                         //但是這個available對於不同的流不同,它的意思是沒有阻塞情況下可以最多讀幾個,比如對於基類InputStream這個函數總是返回0
    }

    static void test2() throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("test"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("test2"));
        String s;
        while ((s = br.readLine())!=null)
            bw.write(s);
        bw.close();                                                                         //使用close或者flush刷新緩衝區,否則結果無法輸出

        BufferedWriter bw2 = new BufferedWriter(new FileWriter("test2"));
        for (int i =0;;++i) {

            if (i%1000==0) bw2.write("a");                                               //緩衝區滿了也會輸出
        }
    }

    static void test3() throws IOException {
        DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("test")));
        DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("test")));
        dos.writeDouble(3.0);
        dos.writeInt(19);
        dos.close();                                            //這裏要關閉寫的流,不然沒法讀
        //System.out.println(dis.readDouble());                 //使用這種方法可以在任何平臺上讀取一組輸入,這非常重要
        //System.out.println(dis.readInt());
        System.out.println(dis.readInt());                      //但是如果搞錯了順序會得到非常奇葩的結果
        System.out.println(dis.readDouble());
    }

    static void test4() throws IOException {
        RandomAccessFile raf = new RandomAccessFile("test2","rw");          //RandomAccessFile是一個可讀可寫的類,而且可以隨機訪問,但是它無法使用裝飾器,與其他的IO類隔絕
        raf.writeDouble(11);
        raf.writeDouble(2);
        raf.writeDouble(33);
        raf.writeDouble(41);
        raf.close();
        RandomAccessFile raf2 = new RandomAccessFile("test2","r");
        for (int i = 0;i<4;++i) System.out.println(raf2.readDouble());
        raf2.close();

        raf = new RandomAccessFile("test2","rw");
        raf.seek(2*8);                                                                  //這裏設置訪問位置
        raf.writeDouble(113);
        raf.close();
        raf2 = new RandomAccessFile("test2","r");
        for (int i = 0;i<4;++i) System.out.println(raf2.readDouble());
        raf2.close();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章