- DataOutputStream类提供三个写入字符串的方法:
-- public final void writeBytes(String s) //由于JAVA的字符编码是Unicode的,第个字符占两个字节,writeBytes方法只是将每个字符的低字节写入到目标设备中
-- public final void writeChars(String s) //writeChars是将字符的两个字节都写入到目标设备中
-- public final void writeUTF(String str) //writeUTF将字符串按照UTF编码写入到目标设备(其中包括长度) - 为什么DataInputStream类中有一个readUTF方法,而没有"readBytes"和"readChars"方法呢?
- 编程实例:分别使用DataOutputStream类的writeUTF,writeBytes和writeChars方法,比较这几个方法的差异。程序中所使用的流栈如下:
-
关闭流栈中的最上层的流对象(DataInputStream,DataOutputStream),将会自动关闭流栈中的所有底层流对象。
//DataStreamTest.java
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.pritnln(dos.readUTF());
dis.close();
}
}
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下的文本换行符是“rn“,而Linux下的文本换行标识符是“n“。
ObjectInputStream与ObjectOutputStream类
- ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流。
- ObjectInputStream与ObjectOutputStream类所读写的对象必须实现了Seralizable接口。对象中的transient和static类型的成员变量不会被读取和写入。
- 一个可以被序列化的MyClass类的定义:
public class MyClass implements Serializable{
public transient Thread t;
private String customerID;
private int total;
}
编程举例:创建了一个可序列化学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读了到一个学生对象中,即恢复保存的学生对象。
//Student.java
import java.io.Serializable;
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 启动类
import java.io.*;
public class Serialization{
public static void main(String[] args) throws Exception {
Student stu1 = new Student(19,"zhangsan",25,"hauxue");
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 ois = new ObjectInputStream(fis);
stu1 = (Student)ois.readObject();
stu2 = (Student)ois.readObject();
ois.close();
System.out.println("id:" + stu1.id);
System.out.println("name:" + stu1.name);
System.out.println("age:" + stu1.age);
System.out.println("age:" + stu1.department);
System.out.println("id:" + stu2.id);
System.out.println("name:" + stu2.name);
System.out.println("age:" + stu2.age);
System.out.println("age:" + stu2.department);
}
}
字节流与字符流的转换
- 能不能找到一种简单的方式来读取键盘上输入的一行字符,如何找?
- InputStreamReader和OutputStreamWriter,是用于将字节流转换成字节流来读写的两个类,InputStreamWriter可以将一个字节流中的字节解码成字符后读取,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。