今天继续学习了IO流的内容,学习内容如下:
1.文件字节流操作:
实现二进制文件的复制

2.用ObjectInputStream和ObjectOutputStream实现将对象序列化在文件中的读写:
/*Student s1 = new Student(11,"小明");
try(FileOutputStream fw = new FileOutputStream("读写对象.txt"); ObjectOutputStream out = new ObjectOutputStream(fw)) {
out.writeObject(s1);
}catch (IOException e){
e.printStackTrace();
}*/
try(FileInputStream fis = new FileInputStream("读写对象.txt");ObjectInputStream ois = new ObjectInputStream(fis)){
Student t= (Student) ois.readObject();
System.out.println(t);
}catch (IOException e){
e.printStackTrace();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
实现对对象的读写操作时必须注意该类必须实现Serializable或Externalizable接口;
3.Serializable和Externalizable
Serializable:
需要提供final static修饰的serialVersionUID进行版本号的统一,可以通过使用transient修饰符来修饰不需要序列化的成员,同时无法序列化static修饰的成员,如果序列化的成员是引用类型则该类型也必须可序列化;
Externalizable:
相比于Serializable更加灵活,也需要给出final static修饰的serialVersionUID进行版本号的统一,同时还需要对writeExternal和readExternal进行重写,在其中挑选想要被序列化的成员,Externalizable可以将transient修饰的成员序列化,并且Externalizable在反序列化的时候会默认调用无参构造方法;
二者的区别与联系:
Serializable序列化过程是递归,相对较缓慢,对于禁止序列化的成员使用transient修饰,在面对属性较多又有一些不需要进行序列化的变量过程较复杂,无法控制字段序列化和反序列化的形式,序列化在处理对象时,不会默认调用构造方法,缺失了构造方法内的逻辑;
而Externalizable序列化更加灵活,可以指定成员指定形式进行序列化,必须重写writeExternal和readExternal并且对于transient和static修饰的成员可以进行序列化,会默认调用无参构造函数;
4.标准输入输出
System.in:标准输入,默认对应的是键盘;
System.out标准输出,默认对应的是显示器;
System.err标准错误输出,默认对应的是显示器;
通过对于标准输入和标准输出流的修改完成文件的复制操作:
try(FileInputStream fis =new FileInputStream("母文件.txt");BufferedInputStream bis =new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("子文件.txt");){
System.setIn(bis);
System.setOut(new PrintStream(fos));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s= br.readLine())!=null){
System.out.println(s);
}
}catch (IOException e) {
e.printStackTrace();
}
5.ByteArrayInputStream和ByteArrayOutputStream
FileWriter,FileReader,FileInputStream,FileOutputStream,都是对于磁盘上文件的存取操作,java虚拟机无权访问硬盘上的资源,需要借助操作系统,java借助完了之后需要通知系统释放资源,所以我们把源头换为一块内存,直接使用java虚拟机的那块内存,使用完不用关闭;
所有的东西都可以转成字节数组,并且字节数组为二进制方便在网络上传输;
文件可以无限的往里面加数据,最终存储在磁盘中,但内存速度快,容量小,所以不建议进行数据量特别大的操作;
String s = "abcdefg";
byte[] bytes = s.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
int v;
v=bais.read();
System.out.println((char)v);
bais.mark(1);
v=bais.read();
System.out.println((char)v);
v=bais.read();
System.out.println((char)v);
v=bais.read();
System.out.println((char)v);
bais.reset();
v=bais.read();
System.out.println((char)v);
v=bais.read();
System.out.println((char)v);
在使用ByteArrayInputStream时支持设立回档点(mark())和回档(reset())的操作,若没有进行回档点设立则默认回到初始位置;
6.DataInputStream和DataOutputStream
类似于ObjectInputStream和ObjectOutputStream对数据进行序列化存储,区别在于DataInputStream和DataOutputStream是对于常见类型数据如(int String char,double...)等数据进行序列化存取;
以上就是我的学习内容请大家批评斧正;

1030

被折叠的 条评论
为什么被折叠?



