包装类的概念与作用
FileInputStream 只能读写字节,如果要往文件写入或读取各种类型的数据,就必须将字节数组转换成其他类型,这就造成了一定的麻烦
DateOutputStream 提供了往各种输出流对象中写入各种类型的数据
注:DateOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应具体的流设备的输出流对象,完成类似DataOutputStream功能的类是一个包装类
DateOutputStream包装类的构造函数语法: public DataOutputStream(OutputStream out)
DateOutputStream部分方法列表
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(float v)
public final void writeDouble(double v)
DateOutputStream类提供了三个写入字符串的方法
public final void writeBytes(String s)//将每个字符(李)的第一个字节写入目标设备中
public final void writeChars(String s)//将每个字符的两个字节写入到目标设备中
public final void writeUTF(String str)//将字符串按照UTF的编码写入到目标设备,目标设备带有长度头
问题:
为什么DataInputStream类中有reaUTF(),而没有readBytes()和readChars()呢?
答:因为只有 writeUTF()有写标记长度所以对于的readUTF()也可以成功读取
实例:分别使用DataOutputStream类的writeUTF,writeBytes和writeChars方法,比较这几个方法的差异
DataStreamTest.java
package IO;
import java.io.*;
public class DataStreamTest {
public static void main(String[] args) throws Exception {
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());
byte[] buf = new byte[1024];
int len = dis.read(buf);
System.out.println(new String(buf, 0, len));
fis.close();
}
}
关闭流栈中的最上层的流对象,将会自动关闭流栈中的所有底层流对象
BufferedInputStream与BufferedOutputStream类
增加缓冲区的目的:
1 允许java程序一次不只是操作一个字节,这样提高了程序的性能
2 由于有了缓冲区,是的流上执行skip,mark和reset方法都成为了可能。
思考:
缓冲区与底层系统提供的缓冲区的区别
底层系统缓冲区直接与目标设备交换数据,一次向硬盘读写大量的数据,而在包装类的缓冲区缓存若干个字节,可以执行一次读取一行的操作。
BufferedInputStream构造方法
BufferedInputStream(InputStream in)//创造一个带有32个字节的缓冲流
BufferedInputStream(InputStream in,int size)//按照指定的大小的缓冲区
BufferedOutputStream构造方法(同理)
BufferedReader和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以同字符流中写入不同操作系统下的换行符
PrintStream类
PrintStream类提供了一系列的Print()println(),可以将基本数据类型的数据格式化成字符串输出,对于肥基本数据类型先用调用对象的toString()然后打印出来。
PrintStream的3个构造函数:
PrintStream(OutputStream out)
PrintStream(OutputStream out,boolean autoflush)//当打印一个字符串的时候,如果出现/n换行符的时候,会清空缓冲区
PrintStream(OutputStream out,boolean autoflush,String encoding)
PrintWriter类与之对应,即使遇到文本换行标识符,PrintWriter不会自动清空缓冲区
ObjectInputStream与ObjectOutputStream类
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类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。
Student.java
package IO;
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;
}
}
Serialization.java
package IO;
import java.io.*;
public class Serialization {
public static void main(String args[]) throws Exception {
Student stu1 = new Student(16, "hgfhf", 25, "ghf");
Student stu2 = new Student(16, "李四", 25, "校验");
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 ois = new ObjectInputStream(fis);
stu1 = (Student) ois.readObject();
stu2 = (Student) ois.readObject();
System.out.println("id:" + stu1.id);
System.out.println("name:" + stu1.name);
System.out.println("age:" + stu1.age);
System.out.println("department:" + stu1.department);
ois.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);
}
}
字节流与字符流的转换
InputStreamReader和OutputStreamWriter用于将字节流转换成字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写到一个字节流中。
InputStreamReader的构造函数
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String CharsetName)
OutputStreamReader的构造函数
OutputStreamReader(OutputStream in)
OutputStreamReader(OutputStream in,String CharsetName)