第7讲 IO/输入与输出-过滤流与包装类

过滤流与包装类
·包装类的概念与作用
·BufferedInputStream与BufferedOutputStream类
·DataInputStream与DataOutputStream类
·PrintStream类
·ObjectInputStream与ObjectOutputStream类
·字节流与字符流的转换

包装类的概念与作用
·通过FileOutputStream对象将一个浮点小数写入到文件中,你感觉有点困难吧?能否通过FileOutputStream对象直接将一个整数写入到文件呢?
·假如有个DataOutputStream类提供了往各种输出流对象中写入各种类型(当然包括浮点小数)的方法。你现在所要做的工作就是:传递一个FileOutputStream输出流对象给DataOutputStream实例对象和调用DataOutputStream实例对象的用于写入浮点小数的方法。
·DataOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出流对象,完成类似DataOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类。
·DataOutputStream包装类的构造函数语法:
 public DataOutputStream(Outputstream out)
·DataOutputStream的部分方法列表:
·public final void writeBoolean(boolean v)
·public final void writeShort(int v)
·public final void writeChar(int v)
·public final void writeInt(int v)
·public final void writeLong(long v)
·public final void writeFloat(float v)
·public fianl void writeDouble(double v)
·public final void writeBytes(String s)


·BufferedInputStream与BufferedOutputStream类
·缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
 -运行Java程序依次不只操作一个字节,这样提高了程序的性能。
 -由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为了可能。
·BufferedInputStream和BufferedOutputStream是Java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
想想这种缓冲区与底层系统提供的缓冲区的区别。
·BufferedInputStream的两个构造函数:
 BufferedInputStream(InputStream in)
 BufferedInputStream(InputStream in, int size)
·BufferedOutputStream类的两个构造函数:
 BufferedOutputStream(OutputStream out)
 BufferedOutputStream(OutputStream out,int size)
·BufferedReader和BufferedWriter类
 BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符

DataInputStream与DateOutputStream类
·DataOutputStream类提供,了三个写入字符串的方法:
 -public final void writeBytes(String s)
 -public final void writeChars(String s)
 -public final void writeUTF(String str)
·为什么DataInputStream类中有一个readUTF方法,而没有“readBytes”和“readChars”方法?

·编程实例:分别使用DataOutputStream类的writeUTF、writeBytes和writeChars方法,比较这几个方法的差异。程序中所使用的流栈如下:
import java.io.*;
public class DataStreamTest {
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) throws Exception {
  // TODO: Add your code here
  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt"));
  DataOutputStream dos = new DataOutputStream(bos);
  String  str = "ab中国";
  dos.writeUTF(str);
  dos.writeBytes(str);
  dos.writeChars(str);
  dos.close();
  
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
  DataInputStream dis = new DataInputStream(bis);
  String newStr = dis.readUTF();
  byte [] buf = new byte[1024];
  int len = dis.read(buf);
  dis.close();
  
  System.out.println(newStr);
  System.out.println(new String(buf,0,len)); 
 } 
}


PrintStream类
·PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据格式化成字符串输出。
·格式化输出是什么意思?例如,97被格式化输出的实际字节数据为0x39和0x37。
·PrintStream的3个构造函数:
 -PrintStream(OutputStream out)
 -PrintStream(OutputStream out,boolean autoflush)
 -PrintStream(OutputStream out,boolean autoflush,String encoding)
·与PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(/n),PrintWriter类也不会自动清空缓冲区。
·PrintWriter的println方法能根据操作系统的不同而生成相应的文本换行标识符。在Windows下的文本换行标识符是“/r/n”,而Linux下的文本换行标识符是“/n”。

ObjectInputStream与ObjectOutputStream类
·ObjectInputSteam和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。
·ObjectInputStream与ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入。
·一个可以被序列化的MyClass类的定义:
public class MyClass implements Serializable
{
 public transient Thread t;
 private String customerID;
 private int total;
}

编程举例:创建了一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。
核心代码:
1.定义实现了Serializable接口的的Student类--代表了该类是可以被序列化的
class Student implements Serializable {
 int id;
 String name;
 int age;
 String department;}
2.编写代码通过ObjectOutputStream写入对象内容到指定的输出目标,然后通过ObjectInputStream从指定的目标中读取数据到Student类中。
实现了自定义类的直接存取:oos.writeObject(sd1);sd1 = (Student)ois.readObject();
import java.io.*;
public class Serializatiion {
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args) throws Exception{
  // TODO: Add your code here
  Student sd1 = new Student(10,"zhangshan",29,"huaxue");
  Student sd2 = new Student(11,"lisi",25,"wuli");
  FileOutputStream fos = new FileOutputStream("content.txt");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(sd1);
  oos.writeObject(sd2);
  oos.close();
  
  FileInputStream fis = new FileInputStream("content.txt");
  ObjectInputStream ois = new ObjectInputStream(fis);
  
  sd1 = (Student)ois.readObject();
  sd2 = (Student)ois.readObject();
  ois.close();
  
  System.out.println(sd1);
  System.out.println(sd2); 
 } 
}


字节流与字符流的转换
·能不能找到一种简单的方式来读取键盘上输入的一行的字符,如何找?
·InputStreamReader和OutputStreamWriter,是用于将字节流转换成字符流来读取写的两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
·InputStreamReader的两个主要的构造函数:
 -InputStreamReader(InputStream in)
 -InputStreamReader(InputStream in,String CharsetName)
·OutputStreamWriter的两个主要那点构造函数:
 -OutputStreamWriter(OutputStream out)
 -OutputStreamWriter(OutputStream out, String CharsetName)
·避免频繁地在字符与字节之间进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类来读写数据,应尽量使用BufferedWriter类包装OutputStreamWriter类,用BufferedReader类包装InputStreamReader类。
事实上所有的字符操作类都是包装类,因为读取文件的最底层肯定是操作字节流的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值