【java基础】12.I/O:流1

来源:互联网 发布:淘宝装修市场怎么进 编辑:程序博客网 时间:2024/06/02 05:47
1.流
1.1流的概念
–Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。
 
输入/输出流:
输入:例如信息从磁盘文件或外部流到了程序或内存,则这个流就是输入流;
输出:从内存输出到磁盘上,
 
•输入/输出时,数据在通信通道中流动。所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据从一个地方“流”到另外一个地方,这种数据流动的通道都可以称为数据流。
输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个“输出数据流”(数据从程序流出)。若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)
 
1.2分类:
1.2.1从功能上分为两大类:输入流和输出流。
从流结构上可分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符),字符流只是对字节流的封装
 
字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。字符流是Java1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer
使用字节流可以读取或写入二进制数据
在最底层,所有的输入/输出都是字节形式的。
 
•字节流类(Byte Streams)字节流类用于向字节流读写8位二进制的字节。一般地,字节流类主要用于读写诸如图象或声音等的二进制数据。
•字符流类(Character Streams)字符流类用于向字符流读写16位二进制字符。
 
 
可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流
逻辑:
读的逻辑:
    打开一个流->whilie循环是否有更多的信息<->读取信息->关闭流
写的逻辑:
    打开一个流->whilie循环是否有更多的信息<->写入信息->关闭流
 
1.2.2
•节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
•过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
一个文件与程序连接的过程中,若从文件到程序,则为输出,与文件相连的为节点流,之后又过滤流,反之,也是。
 
2.字符流
 FileWriter:
对文件的操作,若文件存在,则通过FileWriter(文件路径及名称,boolean值)来判定,若为true,则在该文件后续写内容。其中换行在window中通过\r\n来实现。
 
字符流的缓冲区:提高流的操作效率
BufferedWriter:
    需先有写入流对象Writer,然后建立缓冲区,通过缓冲流写入数据,然后通过flush()刷新流。
    提供了换行操作,newLine()
BufferedReader:
    需先有读取流对象Reader,然后建立缓冲区,通过缓冲流写入数据,然后通过flush()刷新流。
     提供了换行操作,readLine()




3.字节流
•抽象类InputStream和OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种方法都在InputStream和OutputStream中被定义为抽象方法。它们被派生的流类重写。
•每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件(FileInputStream/FileOutputStream),网络连接,甚至是内存缓冲区。
eg:
public class InputStreamTest1{
    public static void main(String[] args) throws Exception{
        InputStream is = new FileInputStream("c:/hello.txt");
        //读取的数据的字节数组
        byte[] buffer = new byte[200];
        int length ;
        while(-1 != (length = is.read(buffer, 0, 200))){//把数据读到buffer数组的0——200个中
            String str = new String(buffer,0, length);//将字节转换为字符
            System.out.println(str);
        }   
        is.close();       
    }
}
 
2.1InputStream
通过打开一个到数据源(文件、内存或网络端口上的数据)的输入流,程序可以从数据源上顺序读取数据

•InputStream中包含一套字节输入流需要的方法,可以完成最基本的从输入流读入数据的功能。当Java程序需要外设的数据时,可根据数据的不同形式,创建一个适当的InputStream子类类型的对象来完成与该外设的连接,然后再调用执行这个流类对象的特定输入方法来实现对相应外设的输入操作。
InputStream类子类对象自然也继承了InputStream类的方法。常用的方法有:读数据的方法read(),获取输入流字节数的方法available(),定位输入位置指针的方法skip()、reset()、mark()等
 
2.2OutputStream
通过打开一个到目标的输出流,程序可以向外部目标顺序写数据
 
•OutputStream中包含一套字节输出流需要的方法,可以完成最基本的输出数据到输出流的功能。当Java程序需要将数据输出到外设时,可根据数据的不同形式,创建一个适当的OutputStream子类类型的对象来完成与该外设的连接,然后再调用执行这个流类对象的特定输出方法来实现对相应外设的输出操作。
•OutputStream类子类对象也继承了OutputStream类的方法。常用的方法有:写数据的方法write(),关闭流方法close()等。
eg:
public class OutputStreamTest1{
    public static void main(String[] args) throws Exception{
        OutputStream os = new FileOutputStream("c:\\out.txt", true);
        String str = "aaaaa";
        byte[] buffer = str.getBytes();
        os.write(buffer);
        os.close();
    }
}
 
3过滤流:
在InputStream类和OutputStream类子类中,FilterInputStream和FilterOutputStream过滤流抽象类又派生出DataInputStream和DataOutputStream数据输入输出流类等子类。
过滤流的主要特点是在输入输出数据的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。
•过滤流在读/写数据的同时可以对数据进行处理,它提供了同步机制,使得某一时刻只有一个线程可以访问一个I/O流,以防止多个线程同时对一个I/O流进行操作所带来的意想不到的结果。
•类FilterInputStream和FilterOutputStream分别作为所有过滤输入流和输出流的父类。
 
4.基本的流类:
•FileInputStream和FileOutputStream
节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
•BufferedInputStream和BufferedOutputStream
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
•DataInputStream和DataOutputStream
过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。
•PipedInputStream和PipedOutputStream
管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。
 
I/O的链接

Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。
•通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。



 注:此文档为学习圣思园风中叶教程结合自身学习所记录。