Java.过滤流(包装流)

包装类的概念与作用
各种字节节点流类,它们都只具有读写字节内容的方法,以FileInputStream与FileOutputStream为例,它们只能在文件中读取或者向文件中写入字节,在实际应用中我们往往需要在文件中读取或者写入各种类型的数据,就必须先将其他类型的数据转换成字节数组后写入文件,或者从文件中读取到的字节数组转换成其他数据类型,很麻烦的!!通过FileOutputStream将一个浮点小数写入到文件中和将一个整数写入到文件时很困难的。
这时就需要包装类DataOutputStream。它提供了往各种输出流对象中写入各种类型的数据的方法。 传递一个FileOutputStream输出流对象给DataOutputStream实例对象和调用DataOutputStream实例对象的用于写入浮点小数的方法。

DataOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出流对象,完成类似DataOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类。它对OutputStream流类进行了包装,使编程人员使用起来更方便。

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 final void writeDouble(double v)
public final void writeBytes(String s)

//DataStreamTest.java import java.io.*; public class DataStreamTest { public static void main(String[] args) throws Exception { // TODO: Add your code here FileOutputStream fos=new FileOutputStream("count.txt"); BufferedOutputStream bos=new BufferedOutputStream(fos); DataOutputStream dos=new DataOutputStream(bos); dos.writeUTF("ab中国"); dos.writeBytes("ab中国"); dos.writeChars("ab中国"); dos.close(); FileInputStream fis=new FileInputStream("count.txt"); BufferedInputStream bis=new BufferedInputStream(fis); DataInputStream dis=new DataInputStream(bis); System.out.println(dis.readUTF()); //读取writeBytes()和writeChars()方法写入的数据(读取结果是乱码)所以一般不用writeBytes和writeChars方法 byte [] buf=new byte[1024]; int len=dis.read(buf); System.out.println(new String(buf,0,len)); fis.close(); } }

 

 


BufferedInputStream与BufferedOutputStream类
对IO进行缓冲是一种常见的性能优化方式
缓冲流为I/o流增加了内存缓冲区,增加缓冲区有两个基本目的:允许Java程序一次不只操作一个字节,这样提高了程序的性能。
由于有了缓冲区,使得在流上执行skip、mark、和reset方法都成为可能。

BufferedInputStream和BufferedOutputStream是Java提供的两个缓冲区包装类,不管地成系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。这种缓冲区与底层系统提供的缓冲区是有区别的。底层系统提供的缓冲区直接与目标设备交换数据。包装类创建的缓冲区需要调用包装类所包装的那个输出流对象将这个缓冲区的数据写入到底层设备或底层缓冲区中。底层缓冲区就是一次向底层设备写入或者读取大量数据。而包装类缓冲区实现一次读取一行的作用

BufferedInputStream的两个构造函数
BufferedInputStream(InputStream in)创建具有32个字节的缓冲区的缓冲流
BufferedInputStream(InputStream in,int size)按size的大小来创建缓冲区

BufferedOutStream类的两个构造函数:
BufferedOutputStream(OutStream out)
BufferedOutputStream(OutputStream out,ont size)

BufferedReader和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符
-------------------
DataInputStream与DataOutputStream类
提供了从I/O流中读写各种基本数据类型数据的各种方法

DataOutputStream类提供了三个写入字符串的方法:
public final void writeBytes(String s)由于Java中的字符编码是Unicode的,每个字符占用两个字节,writeBytes方法只是将每个字符的低字节写入到目标设备中
public final void writeChars(String s)将每个字符中的两个字节都写入到目标设备中
public final void writeUTF(String s)将字符串按UTF编码方式写入到目标设备中,在写入的数据中是带有长度头的

关闭流栈中的最上层的流对象,将会自动关闭流栈中的所有底层流对象


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这两个包装类,用于从底层输入流中读取对象性的数据和将对象类型的数据写入到底层输出流
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类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。
//Serialization.java import java.io.*; public class Serialization { public static void main(String[] args) throws Exception { // TODO: Add your code here Student stu1=new Student(19,"zhangsan",25,"huaxue"); Student stu2=new Student(20,"lisi",23,"wuli"); FileOutputStream fos=new FileOutputStream("student.txt"); ObjectOutputStream os=new ObjectOutputStream(fos); os.writeObject(stu1); os.writeObject(stu2); os.close(); FileInputStream fis=new FileInputStream("student.txt"); ObjectInputStream is=new ObjectInputStream(fis); stu1=(Student)is.readObject(); stu2=(Student)is.readObject(); is.close(); System.out.println("id:"+stu1.id); System.out.println("name:"+stu1.name); System.out.println("age:"+stu1.age); System.out.println("department:"+stu1.department); System.out.println("id:"+stu2.id); System.out.println("name:"+stu2.name); System.out.println("age:"+stu2.age); System.out.println("department:"+stu2.department); } }

 

//Student.java import java.io.Serializable; public class Student implements Serializable { int id; String name; int age; String department; public Student(int id,String name,int age,String department){ this.id=id; this.name=name; this.age=age; this.department=department; } }

 


字节流与字符流的转换
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

FileReader

你可能感兴趣的:(exception,String,serialization,性能优化,Class,newline)