------- android培训、java培训、期待与您交流! ----------
11. BufferedInputStream与BufferedOutputStream类
i. 缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的
1. 允许Java程序一次不只操作一个字节,这样提高了程序的性能
2. 由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能
ii. BufferedInputStream与BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
iii. BufferedInputStream的两个构造函数
1. BufferedInputStream(InputStreamin)
2. BufferedInputStream(InputStreamin,int size)
iv. BufferedOutputStream的两个构造函数:
1. BufferedOutputStream(OutputStreamout)
2. BufferedOutputStream(InputStreamin,int size)
v. BufferedReader和BufferedWrite类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWrite的newLine方法可以向字符流中写入不同操作系统下的换行符
12. DataInputStream与DataOutputStream类
a) DataOutputStream类提供了三个写入字符串的方法:
i. public final voidwriteBytes(String s)
ii. public final voidwriteChars(String s)
iii. public final voidwriteUTF(String str)
b) 编程实例:分别使用DataOutputStream类的writeUTF、writeBytes和writeChars方法,比较这几个方法的差异。程序流栈图如下:
关闭流栈的最上层的流对象,将会自动关闭流栈中的所有底层流对象。
public class DataStreamTest {
public static void main(String[] args)throws Exception{
// TODO Auto-generatedmethod stub
File f = new File("count.txt");
FileOutputStream fos = new FileOutputStream(f);
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(f);
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();
}
}
13. PrintStream类
a) PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据式化成字符串输出。
b) 格式化输出是什么意思?例如,97被格式化输出的实际字节数据位0x37和0x37。
c) PrintStream的3个构造函数
i. PrintStream(OutputStream out)
ii. PrintStream(OutputStream out,booleanautoflush)
iii. PrintStream(OutputStream out,booleanautoflush,String encoding)
d) 与PrintStream对应的PrintWriter类,即使遇到了文本换行标识符(\n),PrintWriter类也不会自动清空缓冲区。
e) PrintWriter的println方法能根据操作系统的不同而生成相应的文本换行标识符。在Windows下的文本换行标识符是”\r\n”,而Linux下的文本换行标识符是”\n”。
14. ObjectInputStream与ObjectOutputStream类
a) ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。
b) ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口
c) 一个可以被序列化的MyClass类定义:
public classMyClass implements Serializable{
public transient Thread t;
private String customerID;
private int total;
}
编程举例:创建一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把它存储的数据读取到一个学生对象中,即恢复保存的学生对象。
Studetn类:
public class Student implementsSerializable {
int id;
String name;
int age;
String department;
public Student(int id, String name,int age, Stringdepartment) {
this.id = id;
this.name = name;
this.age = age;
this.department = department;
}
@Override
public String toString(){
// TODO Auto-generated method stub
return"id=" + id +",name=" + name +",age=" + age +",departmet=" + department;
}
}
Serialization类:
public class Serialization {
public static void main(String[]args)throws Exception{
// TODO Auto-generated method stub
Student stu1= new Student(19,"zhangsan", 25, "huaxue");
Student stu2= new Student(20,"lisi", 35, "wuli");
File f = new File("student.txt");
FileOutputStreamfos = new FileOutputStream(f);
ObjectOutputStreamos = new ObjectOutputStream(fos);
os.writeObject(stu1);
os.writeObject(stu2);
os.close();
FileInputStreamfis = new FileInputStream(f);
ObjectInputStreamis = new ObjectInputStream(fis);
stu1 =(Student)is.readObject();
stu2 =(Student)is.readObject();
System.out.println(stu1.toString());
System.out.println(stu2.toString());
is.close();
}
}
15. 字节流与字符流的转换
a) 能不能找到一种简单的方式来读取键盘上输入的一行字符,如何找?
b) InputStreamReader和OutputStreamWriter,是用于姜字节流转化成字符流来读写这两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
c) InputStreamReader的两个主要的构造函数:
i. InputStreamReader(InputStreamin)
ii. InputStreamReader(InputStreamin,String CharsetName)
d) OutputStreamWriter的两个主要的构造函数:
i. OutputStreamWriter(OutputStreamout)
ii. OutputStreamWriter(OutputStreamout,String CharsetName)
e) 避免频繁地在字符与字节进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类来读写数据,应尽量使用BufferedWriter类包装OutputStreamWriter,用BufferedReader类包装InputStreamReader。
16. java程序与其他进程的数据通信
a) 在java程序中可以用Process类的实例对象来表示子进程,子进程的标准输入和输出不再连接到键盘和显示器,而是以管道流的形式连接到父进程的一个输出流和输入流对象上。
b) 调用Process类的getOutputStream和getInputStream方法可以获得连接到子进程的输出流和输入流对象。
17. 字节输入流类
18. 字节输出流
19. 字符输入流
20. 字符输出流类
21. Decorator设计模式
a) 在程序中用一个对象(the Decorators)包装另一个对象。这是一种被称为Decorator的设计模式。
b) 如果要加、设计自己的IO包装类,这个类需要基础以FilterXXX命名的类,例如,设计一个输入输出包装类:RecordInputStream和RecordOutputStream,老完成从数据库文件中读取记录和往数据库文件中写入记录。
c) Exception类从Throwable类继承的三个printStackTrace方法定义如下:
i. public void printStackTrace()
ii. public voidprintStackTrace(PrintStream s)
iii. public voidprintStackTrace(PrintWrite s)
把printStackTrace方法打出的详细异常信息存储到一个字符串中:
public class TestPrintWrite {
/**
* @param args
*/
public static void main(String[]args) {
// TODO Auto-generated method stub
try{
throw new Exception("test");
}catch(Exception e){
StringWritersw = new StringWriter();
PrintWriterpw = new PrintWriter(sw);
e.printStackTrace(pw);
System.out.println(sw.toString());
}
}
}