流模型
输入流:数据源不确定,目标地是程序;
输出流:数据源是程序,目标地不确定;
字节流:按字节传输的-二进制数据;
字符流:按字符传输-文本文件;
一.四个抽象类代表以上说的四种情况:1.字节输入流InputStream;
2.字节输出流OutputStream;
3.字符输入流Reader;
4.字符输出流Writer;
二.操作流:1.确定管道
a.确定输入/输出;
b.确定字节字符;
c.确定另一端端点;
2.产生管道对象;
3.调用管道的read方法/write方法;
4.关闭管道;
在调用write方法时一般配合调用flush方法,flush方法的作用是强制输出缓存区输出并且对程序造成阻塞效果保证数据完全输出;
三.流的分类
1.字节流
有明确的目标点和数据源,直接传输数据;
2.处理流
处理流无法确定目标点和数据源只能与节点流连接,形成一个功能更强大的管道;
四.对象的序列化和反序列化
序列化-将内存中的一个对象以二进制的形式输出;反序列化-将输入的二进制对象流转换为一个对象;(这是一个新的产生对象的方式);
只有实现了Serializable接口的类并且这个类的所有属性也实现了Serializable接口,那么该类产生的对象才能被序列化;
补充-接口分类:1.功能接口,让没有继承关系的类共享行为;
2.标识接口,唯一的目的就是给某个类打上标志,允许他参与某个行为;
Serializable接口就是一个标准的标识接口;
举一个2进制文件拷贝的例子:
public static void main(String[] args) { // TODO Auto-generated method stub FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("D:/360极速浏览器下载/MiInst.exe"); fos = new FileOutputStream("J:/lajixiaomi.exe"); byte[] buff = new byte[1024]; int length = 0; while((length = fis.read(buff)) != -1){ fos.write(buff, 0, length); fos.flush(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(fis != null){ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(fos != null){ try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }