IO流与IO缓冲

1.字节与字符的演变

public class inputStream {

    public static void test1() throws Exception{
        File file= new File("D:\\log.txt");
        //从文件中读取消息
        FileInputStream inputStream =new FileInputStream(file);
        System.out.println(inputStream.getChannel());
        //决定是否使用缓存
        BufferedInputStream stream=new BufferedInputStream(inputStream);
        //filterInputStream的一种,控制特定输入流和输出流
        DataInputStream in =new DataInputStream(inputStream);

        FileOutputStream outputStream =new FileOutputStream(file);
        BufferedOutputStream stream1=new BufferedOutputStream(outputStream,1024);
        DataOutputStream out =new DataOutputStream(stream1);
        //只能是英文或者数字
        out.writeBytes("hello world!");
        out.close();
        while(in.available()!=0){
            System.out.print((char)in.readByte());
        }
       in.close();

    }

    public static void test2() throws Exception{

        File file=new File("D:\\log.txt");
        FileInputStream inputStream =new FileInputStream(file);
        InputStreamReader streamReader =new InputStreamReader(inputStream);
        BufferedReader reader =new BufferedReader(streamReader);

        FileOutputStream outputStream =new FileOutputStream(file);
        OutputStreamWriter writer = new OutputStreamWriter(outputStream);

        writer.write("哈哈");
        writer.close();

        while (reader.ready()){
            System.out.print(reader.read());
        }
        reader.close();

    }
    public static void main(String[] args){
        try {
            test2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

有一点很清楚,无论我们何时使用readline(),都不应该使用DataInputStream,而应该使用BufferedReader,除了这一点,DataInputStream仍然是I/O类库的首选成员。

 2.通道与缓冲之间的秘密

/**
 * 通道以原始的字节形式或者基本数据类型输出和读取数据
 * 没办法输出或者读取对象,即使是字符串对象也不行
 *
 * NIO的方法主要是将数据以ByteBuffer的形式写入到文件,一块一块的写,就快了好多。
 */
public class Channels {

    private final static int SIZE=1024;
    public static void main(String[] args)throws IOException{
        FileChannel fc =new FileOutputStream("D:\\log.txt").getChannel();
        //wrap()函数是用于将数组包装在ByteBuffer中
        fc.write(ByteBuffer.wrap("some test!".getBytes()));
        fc.close();

        fc=new RandomAccessFile("D:\\log.txt","rw").getChannel();
        //把通道随处移动到fc的末尾,进行数据追加
        fc.position(fc.size());
        fc.write(ByteBuffer.wrap("some more!".getBytes()));
        fc.close();

        fc=new FileInputStream("D:\\log.txt").getChannel();
        //分配缓存
        ByteBuffer buffer = ByteBuffer.allocate(SIZE);
        //往缓存中写东西
        fc.read(buffer);
        //做好让别人读取字节的准备
        buffer.flip();
        while(buffer.hasRemaining()){
            System.out.print((char)buffer.get());
        }
    }
}

如果把通道当作一个煤矿,则ByteBuffer则是去煤矿的唯一小车,ByteBuffer装成一块一块的,去读或者写。

posted @ 2017-11-24 10:39  呼呼呼呼呼65  阅读(246)  评论(0编辑  收藏  举报