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();
    }
}

 

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