zoukankan      html  css  js  c++  java
  • io流

    IO流(Input Output):

    文件和程序直接项链的我们称为:节点流.

    文件和程序之间有两个过程,显然是经过处理,我们称:处理流.

     

    流的分类:

    从文件等(数据源)到程序的我们称之为输入流(InputStream,Reader读进来)

    从程序到目的地我们称之为输出流(OutPutStream,Writer写出去)

     

    处理数据单元:

    字节流:按照字节读取数据

    字符流:按照字符读取数据.

     

    功能不同:

    1.节点流:可以直接从数据源换货目的地读写数据.

    2.处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装,目的主要是简单化操作和提高性能.

     

     

    什么是IO流:

    1.在Java程序中,对于数据的输入输出的操作以“流”(stream)方式进行.

    2.J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的输入或输出数据.

    3.Java的流类型一般位于包中.

     

    流的概念:

    数据源:数据从哪来的?

    1.data source. 提供原始数据的原始媒介,常见的:数据库,文件,其他程序,内存,网络连接,IO设备.

    2.数据源就像水箱,流就像水管中流着的水流,程序就是我们的最终用户,流就是一个抽象,动态的概念,是一连串连续动态的数据集合.

     

    节点流和处理流的关系:

    1.节点流处于io操作的第一线,所有操作必须通过他们进行.

    2.处理流可以对其他流进行处理(提高效率或操作灵活性)

     

     

    文件字节流:

    一,FileInputStream/FileOutStream

    这些方法都是抽象类:

    1.使用FileInputStream(字节输入流)读取文件内容

    (1)abstract int read();//读取一个字节.

    (2)int read (byte b[]);

    (3)int read(byte b[];int off,int len);

    (4)int available();

    (5)close();//关闭

     

    2.FileOutputSteam(字节输出流).写内容到文件.

    (1)abstract void write(int b);//一次写一个字节

    (2)void write(byte b[]);//用数组输出字节

    (3)void write(byte b[],int off,int len);

    (4)void flush();//刷新缓冲区

    (5)void close();//关闭

     

     

    二:缓冲字节流

    1.读文件和写文件都使用了缓冲区,减少了读写次数,从而提高了效率.

    2.当创建这两个缓冲流的对象时时,会创建了内部缓冲数组,缺省使用 32 字节大小的缓冲区.

    3.当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区.

    4.当写入数据时,首先写入缓冲区,当缓冲区满时,其中的数据写入所连接的输出流。使用方法 flush()可以强制将缓冲区的内容全部写入输出流.

    5.关闭流的顺序和打开流的顺序相反.只要关闭高层流即可,关闭高层流其实关闭的底层节点流

    6.Flush 的使用:手动将 buffer 中内容写入文件.

     

     

    二(2)

    InputStreamReader 的作用是把 InputStream 转换成 Reader

    OutputStreamWriter 的作用是把 OutputStream 转换成 Writer

     

    三:打印流

    1.PrintStream 提供了一系列的 print()和 println(),可以实现将基本数据类型格式化成字符串输出。对象类型将先调用toString(),然后输出该方法返回的字符串.

    2.System.out 就是 PrintStream 的一个实例,代表显示器.

    3.System.err 也是 PrintStream 的一个实例,代表显示器.

    4.PrintStream的输出功能非常强大,通常需要输出文本内容,都可以将输出流包装成 PrintStream 后进行输出

    5..PrintStream 的方法都不抛出 IOException.

     

     

    四:数据流

    1.提供了可以存取所有 Java 基础类型数据(如:int,double等)和 String 的方法。

    2.处理流,只针对字节流,二进制文件.

    3.输入流链和输出流链

    4.注意:只要关闭上层流即可.

     

     

     

    五:对象流

    写对象:

    //第一步:创建对象流对象

    //第二步:第二步写对象

    //第三步:判断和关闭

    读对象:

    //第一步:创建对象流对象

    //第二步:读对象

    对象序列化(Serialization)

    ObjectOutputStream——>写对象(把对象的状态以字节的形式写入我们的磁盘的文件上)->又被称之为序列化

    ObjectInputStream-->读对象->反序列化(磁盘上字节形式的数据还原成对象的内存状态)

     

    将Java对象转换成字节序列(IO字节流)

    对象反序列化(DeSerialization)

    从字节序列中恢复java对象.

     

     

    为什么需要序列化:

    序列化的对象可以保存到磁盘里面,也可以在网络上传输,使得不同的计算机可以共享对象(序列化的字节序列是与平台无关的)

     

    对象序列化需要的条件:

    只有实现了Seralizable接口的类的对象才可以被序列化,Serializable接口中没有任何的方法,实现改接口的类不需要实现额外的方法.如果对象的属性是对象,属性对应类也必须实现Serializable接口.

     

    序列化能保存的元素内容:

    1).只能保存对象的非静态成员变量.

    2).不能保存任何成员方法和静态成员变量.

    3).不保存Transient成员变量.

    4).如果一个对象的成员变量是一个对象,这个对象的成员变量也会被保存.

    5).串行化保存的只是变量的值,对于变量的任何修饰符,度不能保存.

     

    2.使用对象流把一个对象写到问件时不仅保证该对象时序列化的,而且该对象的成员对象也必须是可序列化的.

     

    3.如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列元操作将会失败,并且会抛出一个NotSerializableException.我们可以将这个引用标记为transient,那么对象仍然可以序列化.

     

     

     

    对象序列化需要注意的事项:

    一:同一个对象多次序列化的处理

    1.所有保存到磁盘中的对象都有一个序列化编号.

    2.序列化一个对象中,首先检查该对象是否已经序列化过.

    3.如果没有进行序列化

    4.如果序列化了,将不再重新序列化,而是输出编号即可.

    二:

    如果不希望某些属性(敏感)序列化,或不希望出现递归序列

    1.为属性添加transient关键字(完成排除在序列化之外)

    2.自定义序列化(不仅可以决定那些属性不参与序列化)还可以定义属性具体如何序列化

     

    三:序列化版本不兼容

    1.修改了实例属性后,会影响版本号,从而导致反序列化不成功.

     

     

     

     

    文件夹的复制:

    复制文件夹:字节流和字符流.

    字节流:缓冲字节流(BuffereddInputStream,BufferedOutputStream,FileInputStream,FileOutputStream)

    装饰者模式   总归我们记住一句话   是你还有你  ,一切拜托你

    优点:

    1.扩展对象功能,比继承灵活,不会导致类个数急剧增加.

    2.可以对一个对象进行多次装饰,创建不同行为的组合得到功能更加大的对象.

    3.具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类.

     

    缺点:

    1.产生很多小对象,大量小对象占据内存,一定程度影响性能.

    2.装饰模式易于出错,调试排查比较麻烦.

     

     

    IO流实现这些细节:

    1.抽象构件角色 InputStream,OutputStream,Reader,Write.

    2.具体构件角色:FileInputStream,FileOutputStream,

    3.装饰器角色:FilerterInputStream,FilerOutputStream,持有一个抽象构件的引用.

    4.具体装饰角色:BufferedInputSteam,BufferedOutputStream等.

     

    IO流体系总结:

    IO流整体架构体系:

    1.字节流:InputStream,OutputStream

    2.字符流:Reader,Writer

    3.数据流:DataInputStream,DataOutputStream

    4.对象流:ObjectInputStream,ObjectOutStream

    5.缓冲流:BufferedInputStream,ObjectOutputStream,BuffereReadre,BufferedWriter.

    6.转换流:InputStreamReader,OutputStreamWriter.

  • 相关阅读:
    Keras入门(一)之基础篇
    Keras.layers各种层介绍
    python 深度学习
    git 与 tfs 源代码迁移工具
    使用RazorGenerator和预编译MVC引擎将Razor视图编译成DLL
    python资源
    .net Core 资源
    【ElasticSearch】win10 安装elasticSearch 6.6.1
    代码注释主要有哪几种
    html和css基础知识
  • 原文地址:https://www.cnblogs.com/0307lmy/p/11543097.html
Copyright © 2011-2022 走看看