---------------------- android培训、java培训、期待与您交流! ----------------------
BufferedInputStream与BufferedOutputStream类
l 缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
允许JAVA程序一次不只操作一个字节,这样提高了程序的性能。
由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能。
l BufferedInputStream与BufferedOutputStream类是JAVA提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
BufferedInputStream的两个构造函数:
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream类的两个构造函数:
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out, int size)
BufferedReader和BufferedWriter类
l BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符。
DataInputStream类与DataOutputStream类
DataOutputStream类提供了三个写入字符串的方法:
public final void writeBytes(String s)
public final void writeChars(String s)
public final void writeUTF(String s)
为什么DataInputStream类中有一个readUTF方法,而没有“readBytes”和“readChars”方法呢?
答:要在一个连续的字节流中读取一个字符串,这个字符串只是这个连续的流中的一段内容,如果没有特殊的标志作为一个字符串的结尾,那么实际上也不知道这个字符串的长度,那也不知道该读取到什么位置才是这个字符串的结尾处。由于writeUTF方法向字符串的结尾处写入了字符串的长度,writeBytes与writeChars方法没有在字符串的结尾处写入字符串的长度,所以DataInputStream类中有一个readUTF方法来与DataOutputStream中rwriteUTF方法相对应,而没有与writeBytes与writeChars方法相对应。
编程实例:
分别使用;DataOutputStream类的writeUTF、writeBytes和;writeChars方法,比较这几个方法的差异。程序中所使用的流栈如下:
关闭流栈中的最上层的流对象,将会自动关闭流栈中的所有底层流对象。
------------TeatDataStream.java----------------
import java.io.*;
public class TeatDataStream {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("tds.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("tds.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));
dis.close();
}
}
运行结果:
ab中国
ab-?abN-V?
用记事本打开生成文件看到的结果:
ab涓浗ab-? a bN-V?
PrintStream类
PrintStream类提供了一系列的printer和println方法,可以将基本数据类型的数据格式化成字符串输出。
格式化输出是什么意思?例如,97被格式化输出的实际字节数据为0x39和0x37.
PrintStream的3 个构造函数:
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush)
PrintStream(OutputStream out, boolean autoFlush, String encodeing)
与PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(\n),PrintWriter类也不会自动清空缓冲区。
PrintWriter的println方法能根据操作系统的不同而生成相应的文本换行标识符。在Windows下的文本换行标识符是“\r\n”,而在Linux下的文本换行标识符是“\n”。
ObjectInputStream与ObjectOutputStream类
l ObjectInputStream与ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。
l ObjectInputStream与ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入输出流中。
一个可以被序列化的MyClass类的定义:
pulbic class MyClass implements Serializable{
public transient Thread t;
Private String customer ID;
private int total;
}
l 编程举例:创建了一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。
--------------TestObjectStream .java-----------------
import java.io.*;
public class TestObjectStream {
public static void main(String[] args) throws Exception
{
Student stu1 = new Student("zhang san", 23, "计算机系");
Student stu2 = new Student("lisi", 24, "电气系");
FileOutputStream fos = new FileOutputStream ("student.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.writeObject(stu2);
oos.close();
FileInputStream fis = new FileInputStream("student.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
stu1 = (Student)ois.readObject();
stu2 = (Student)ois.readObject();
ois.close();
System.out.println("stu1:" + stu1.name + stu1.age + stu1.department);
System.out.println("stu2:" + stu2.name + stu2.age + stu2.department);
}
}
class Student implements Serializable {
String name;
int age;
String department;
public Student(String name, int age, String department) {
this.name = name;
this.age = age;
this.department = department;
}
}
字节流与字符流的转换
能不能找到一种简单的方式来读取键盘上输入的一行字符,如何找?
答:能。从API中找
InputStreamReader和OutputStreamWriter,是用于将字节流转换成字符流来读写两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
InputStreamReader的两个主要的构造函数:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in, String charsetName)
OutputStreamReader的两个主要的构造函数:
OutputStreamReader(OutputStream out)
OutputStreamReader(OutputStream out, String charsetName)
避免频繁地在字符与字节间进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类来读写数据,应尽量使用BufferedWriter类包装OutputStreamWriter类,用BufferedReader类包装InputStreamReader。
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima