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流分类详解与常用流用法实例

Java流概念:Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO。可以把流想象成水流,里面的水滴有序的朝某一方向流动。水滴就是数据,且代表着最小的数据流动单位...
  • zhangliangzi
  • zhangliangzi
  • 2016年04月23日 17:01
  • 1857

javaIO流之字节流的四种方式复制文件方式总结

/* * 需求:把e:\\a.mp4复制到当前项目目录下的copy.mp4中 * * 字节流四种方式复制文件: * 基本字节流一次读写一个字节: 共耗时:117235毫秒 * 基本字节流一...
  • u012110719
  • u012110719
  • 2015年07月25日 23:43
  • 1052

javaIO流、File文件知识总结

JAVA流 流 定义:一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。            本质是数据传输。 作用:数据在设备间进行传递。 分类:按流向不同       ...
  • Yujan_2015
  • Yujan_2015
  • 2017年12月06日 21:48
  • 52

Java IO流经典练习题

本文对javaIO流的练习题做了比较详细的解答,其中有比较基础的,也有比较繁琐的,都是可以加深对javaIO流的全面的理解...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年09月19日 09:10
  • 13314

使用java的IO字节流拷贝图片

需求: 拷贝一张图片。 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;...
  • oguro
  • oguro
  • 2016年12月19日 10:29
  • 1460

java中IO流的知识点总结

1.流的概念流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。2.IO流...
  • u011626964
  • u011626964
  • 2015年09月01日 10:39
  • 6896

JAVA中IO流中的file类输出流和输入流,递归函数笔记总结,附习题

今日内容介绍 1、File 2、递归=======================第一节课开始=============================================01IO技术...
  • qq_38336023
  • qq_38336023
  • 2017年07月19日 11:23
  • 271

java要点笔记——IO流

------- android培训、java培训、期待与您交流! ---------- IO流 day2001-IO流(输入流&输出流) 1、IO(Input  Output)流:IO流用来处理设备...
  • u013114489
  • u013114489
  • 2015年07月22日 11:32
  • 475

简单的 io流文件复制(字符流编码乱码转换)

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io...
  • Queen_xzx
  • Queen_xzx
  • 2017年02月16日 11:10
  • 1174

【JavaIO】JavaIO流分类

Java中的流,可以从不同的角度进行分类。 按照数据流的方向不同可以分为:输入流和输出流。 按照处理数据单位不同可以分为:字节流和字符流。 按照实现功能不同可以分为:节点流和处理流。 输出流: ...
  • zhangzeyuaaa
  • zhangzeyuaaa
  • 2014年11月30日 12:54
  • 976
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JavaIO流(二)
举报原因:
原因补充:

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