JavaIO流(二)

原创 2015年07月10日 22:30:02
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);





相关文章推荐

JavaIO流基础笔记(二)

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 最近在he...

黑马程序员_javaIO流(二)

---------------------- android培训、java培训、期待与您交流! ---------------------- 一、File类 用来将文件或者文件夹封装成...
  • zwq5337
  • zwq5337
  • 2012年05月29日 21:56
  • 95

javaIo与流 读写文件

  • 2011年12月17日 16:00
  • 848KB
  • 下载

java零基础自学 之 JavaIO流处理

  • 2011年08月19日 18:19
  • 2.35MB
  • 下载

第二十章 JAVAIO流文件传输基础学习

本文主要会讲到以下部分: 编码问题 File类的使用 RandomAccessFile的使用 字节流的使用 字符流的使用 对象的序列化和反序列化第一节 文件的编码我们首先建立三个文本文件联...

JavaIO流详细总结

  • 2012年08月17日 00:49
  • 635KB
  • 下载

IO流 javaio java 流

  • 2012年06月01日 12:48
  • 268KB
  • 下载

javaIO流接口总结

Java流操作有关的类或接口: Java流类图结构:   流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的...

JAVAIO流学习总结(转)

  • 2012年09月05日 11:23
  • 3.51MB
  • 下载

javaIO流笔记

  • 2014年08月10日 01:54
  • 16KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaIO流(二)
举报原因:
原因补充:

(最多只允许输入30个字)