打印流
PrintStream和PrintWriter都属于输出流,分别针对字节和字符
PrintWriter 和PrintStream都提供了重载的println方法用于输出多类型数据
print(Object):void
输出引用类型,实际上是调用对象的同toString方法转换为String进行输出
public void println(Object x) {
String s = String.valueOf(x); //调用String类中的静态方法将object类型的
//数据转换为字符串
synchronized (this) {
print(s);
newLine(); //print('\n')
}
}
//String中的valueOf方法的定义
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString(); //如果输出对象非空,则
//调用对象的toString方法
}
println表示输出后自动换行
PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息 PrintWriter和PrintStream有自动的flush功能 textOut.flushBuffer();
PrintWriter(Writer)
PrintWriter(Writer out, boolean autoFlush)自动刷新----println
PrintWriter(OutputStream out) //参数是一个字节流,但是不需要通过桥接处理
PrintWriter(OutputStream out, boolean autoFlush)
PrintStream(OutputStream)
PrintStream(OutputStream out, boolean autoFlush
对象流
使用DataInputStream或者DataOutputStream 可以读写对象数据,但是操作比较繁琐;
int id=dis.readInt(); //用户id--用户标识
int len=dis.readInt(); //用户名称的字符数
StringBuilder username=new StringBuilder(); //用户名称
for(int i=0;i<len;i++) //一次读取一个字符,然后拼接成完整的字符串
username.append(dis.readChar());
len=dis.readInt();
StringBuilder password=new StringBuilder(); //用户口令
for(int i=0;i<len;i++)
password.append(dis.readChar());
double balance=dis.readDouble(); //用户余额
if(dis==id){
res=new Account(); //Account是一个自定义类型,用于封装账户信息
res.setUsername(username.toString());
res.setPassword(password.toString());
res.setBalance(balance);
break;
}
SUN提供了ObjectlnputStream/ObjectOutputStream可以直接将Object写入或读出这里实际上还有针对8种简单类型及其包装类的操作方法,以及针对String 类型的操作方法
readObject():Object
writeObject(Object):void
Date now=new Date();
ObjectOutputStream oos=new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("data3.txt")));
oos.writeObject(now);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new BufferedInputStream(new FileInputStream("data3.txt")));
Object obj=ois.readObject();
if(obj!=null && obj instanceof Date) {
Date dd=(Date)obj;
System.out.println(dd);
}
ois.close();
读写一个对象的前提是这个类型的对象是可以被序列化的;
NotserializableException;
对象序列化【简单来说就是对象可以直接转换为二进制数据流】/对象的反序列【可以将二进制数据流转换为对象】,这一般依靠Jvm实现,编程中只做声明对象序列化的目标是将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,,从 而允许把这种二进制流持久地保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点,其他程 //从文件中按照id值查找对应的对象
如何声明对象所属于的类可以进行序列化和反序列化Serializable/Externalizable接口 其中的接口没有任何定义,仅仅只起到了说明的作用,这种接口叫做标志接口或者旗标接口
可以通过ObjectInputStream【readObject():Object】和 ObjectOutputStream【writeObject(Object):void】提供的方法直接操作对象