JavaIO流(二)

来源:互联网 发布:bl网络剧推荐2016 编辑:程序博客网 时间:2024/05/01 22:16
1、 字符流
       Java语言引入字符流,其实字符流就是对字节流做的编码与解码。我们将一个字符串写入文件,其实是将字符串编码为字节;我们从文件读取一个字符串,其实就是将字节解码为字符串。
       java.io.Reader和java.io.Writer与其子类都是处理字符流的相关类。简单的说,就是对流数据以一个字符(两个字节)的长度为单位来处理,并进行适当的字符编码转换处理,即Reader、Writer与其子类可以用于进行所谓纯文本文件的字符读写。
       (1)InputStreamReader和OutputStreamWriter
             这两个类继承自Reader类与Writer类,提供字符读写功能,这两个类可以用InputStream和OutputStream来构建。
             InputStreamReader  高级流
             构造方法详见api
             InputStreamReader(InputStream in);//Creates an InputStreamReader that uses the default charset.
             InputStreamReader(InputStream in, String charsetName); //Creates an InputStreamReader that uses the named charset.
             OutputStreamWriter  高级流
             OutputStreamWriter(OutputStream out) ;//Creates an OutputStreamWriter that uses the default character encoding.
             OutputStreamWriter(OutputStream out, String charsetName);//Creates an OutputStreamWriter that uses the named charset.
            示例如下:
FileOutputStream fos=new FileOutputStream("char.txt");OutputStreamWriter osw=new OutputStreamWriter(fos);FileInputStream fis=new FileInputStream("char.txt");InputStreamReader isw=new InputStreamReader(fis);
       (2)FileReader和FileWriter
             如果想要存取的是一个文本文件,可以直接使用FileReader和FileWriter类,它们分别继承自InputStreamReader和OutputStreamWriter,可以直接指定文件名称或File对象来打开指定的文本文件,并读入流转换后的字符,字符的转换会根据系统默认的编码(若要指定编码,则还是使用InputStreamReader和OutputStreamWriter)。
       (3)BufferedReader和BufferedWriter
             继承自Reader与Writer类,写入数据不会立刻写到输出流中,而是首先进入buffer,随时将缓冲中的数据写至输出流中,如果想立刻将缓冲区的数据写入输出流,一定要调用flush()方法。
             BufferedReader   高级缓冲字符输入流
             BufferedReader(Reader in) //Creates a buffering character-input stream that uses a default-sized input buffer.
             BufferedWriter   高级缓冲字符输出流
             BufferedWriter(Writer out) //Creates a buffering character-output stream that uses a default-sized output buffer.
       (4)PrintStream和PrintWriter
             PrintStream类是过滤器类中不可忽视的成员,我们常用的System.out就是PrintStream的实例,与之对应的字符流类就是PrintWriter类。
             PrintStream有两个构造函数(API中已标记为过时)
               public PrintStream(OutputStream out);
               public PrintStream(OutputStream out,boolean autoFlush);
             其中,autoFlush置为true时,每当输出遇到换行符,缓冲区的内容就被强制全部输出,如同调用了一次flush(),需要注意的是,如果没遇到换行符,还是会有数据在缓冲区里。
             PrintWriter是JDK1.1版本增加了与字节流I/O相对应的字符流I/O。但是,为了保持兼容性,原先的类几乎没有改动。再加之调试的需要,PrintStream类被保留,并且System类中的成员变量out、err仍作为它的对象。然而,PrintWriter用于大多数输出比PrintStream更为合适,因此1.1版本的API中建议新开发的代码使用PrintWriter类,并将PrintStream类的两个构造函数标记为过时。这样,虽然使用System.out输出不会产生问题,在程序中创建新的PrintStream对象时却会产生编译时的警告。
             注意:PrintWriter类与PrintStream类的方法是对应的。有一个不同之处就是当前者构造函数中autoFlush设置为true时,仅当println()方法被调用时才自动清缓冲区,而不是像PrintStream一样遇到一个换行符就清缓冲区。
       (5)CharArrayreader和CharArrayWriter
              前面介绍了ByteArrayInputStream和ByteArrayOutputStream,它们是将位数组当做流输入来源、输出目的地的类,与其相似的是,CharArrayreader和CharArrayWriter使用它们可以将字符数组当做字符数据的输出或输入的来源。由于Java中的字符是Unicode字符,通过这个特性,可以将文本文件的内容读到字符数组,对字符数组作随机存取,然后再将之写回文件。这样对于文本文件也可以达到类似随机存取的功能。
       (6)RandomAccessFile类
              随机文件访问类,支持对文件的随机读写操作。只有RandomAccessFile支持搜寻方法,并且只适用于文件。该类实现了DataInput接口和DataOutput接口,因此可以读写基本数据类型的数据。
2、 对象序列化
       Stream可以将连续的bit构成的基本数据类型的数据写至流中。倘若将数据的集合(对象)写入流中,则应将构成对象的数据排成一系列的数据,再将其写入流中,这个过程称为序列化;反之,将序列化的数据恢复为原来对象的过程称为序列化的解体。对象的序列化指将对象写入流,解体指从流中获取数据。
       可序列化的类一定要实现了Serializable接口,Serializable是一个标识接口,其中没有任何抽象方法。
       ObjectInputStream继承了OutputStream类,实现了ObjectInput接口,用于将数据源读入对象。
       ObjectOutputStream继承了OutputStream类,实现了ObjectOutput接口,将对象序列化写入流。
       注意:如果要序列化的类重写了writeObject和ReadObject方法,则序列化的过程要与反序列化的顺序相同。不想序列化的成员可以修改为transient。用法示例如下:
//定义一个Man类用于序列化class Man implements Serializable{    String name;    int age;}FileOutputStream fos=new FileOutputStream("man.dat");ObjectOutputStream oos=new ObjectOutputStream(fos);Man man=new Man();man.name="张三";man.age=22;oos.writeObject(man);//将对象序列化写入流oos.close();FileInputStream fis=new FileInputStream("man.dat");ObjectInputStream ois=new ObjectInputStream(fis);Man m=(Man)ois.readObject();ois.close();System.out.println(m.name);<pre name="code" class="java">System.out.println(m.age);



0 0
原创粉丝点击