Java学习笔记之流

2012年03月06日 分类:学习笔记Java

在Java中数据的输入和输出以流(stream)的方式进行,相对应的Java给我们提供了各种各样的流的类,通过这些类我们就可以方便的完成数据的读取和写入。

按照数据流的方向可以分为:输出流和输入流。
按照处理数据单位的不同可以分为:字节流和字符流。
按照功能的不同可以分为:节点流和处理流。

我们一个个来,输出流的话就是程序向外面写数据,一般都类名中都带有Output或者Writer;输入流是程序从外面读取数据,类名中都带有Input或Reader。字节流,一看到这个名字就会想到他处理的是字节(8 bit),而字符流的话里面传输的是字符(16 bit)。

还有就是节点流和处理流,这个比较复杂,我们先看几张图。 stream 我们可以把流比作一根管子,一端连到数据端,另一端到程序。节点流就是直接读写数据,如上图最小的那个管子,他的两端连的就是程序和数据;处理流就是在节点流外面套着的管子,处理流是以节点流为输入,对数据进行相对应的处理,为程序提供更为强大的处理能力。

举个例子,比如我们要读取一个文件。首先我们要选择一种输入节点流,在上图中File类型的输入节点流有两种:FileReader和FileInputStream。这里我选择FileReader,按字符读取。然后我们可以给他包一层管子,为了让读取更快点,选择BufferedReader作为处理流,这样我们就可以使用他的readLine方法,每次读取一行。

String s = null;
BufferedReader br = new BufferedReader(new FileReader("e:\\test.txt"));
while((s = br.readLine()) != null){
    System.out.println(s);
}
br.close();

Java中的流不仅可以读写数据,还可以直接读取Object对象,这就是Object流,先看一个例子。

public class TestObjectIO {
 public static void main(String args[]) throws Exception {
    T t = new T();
    t.k = 8;
    FileOutputStream fos = new FileOutputStream("e:/object.dat");
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(t);
    oos.flush();
    oos.close();
    
    FileInputStream fis = new FileInputStream("e:/object.dat");
    ObjectInputStream ois = new ObjectInputStream(fis);
    T tReaded = (T)ois.readObject();
    System.out.println(tReaded.i + " " + tReaded.j + " " + tReaded.d + " " + tReaded.k);
    
 }
}

class T implements Serializable {
 int i = 10;
 int j = 9;
 double d = 2.3;
 transient int k = 15;
}

这里我们定义了一个类T并让他实现Serializable,也就是让他可以序列化,要想让他能转化成Object流这个是必须的,这是个标记接口,里面没有定义方法。类T实例化一个对象t,由于Object序列化后是一些二进制编码什么的,所以使用FileOutputStream(字节流)作为节点流,外面嵌套ObjectInputStream处理流,把t写入到object.dat中。下面的就是从object.dat文件中读取T对象,过程和上面的相反。最后打印出来的数据k将等于0,这是因为k在定义的时候使用了transient修饰符,他表示k在被序列化时不予考虑他的值。也就是说k在被写入到文件中后他的值将丢失,在此被读取出来时会被初始化,Java在初始化变量时是赋值为0的。

每种流都有它独特的作用,在使用的时候要根据实际情况选择,这样能大大方便数据的读写。

作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2012/03/java-stream