io系列之常用流二

一、对象的序列化、持久化。

    将java的对象的基本数据类型和图形存入文件中,实现对象数据的序列化和持久化。

    操作对象可以使用: ObjectOutPutStream 和 ObjectInPutStream ,

     而被操作的对象: 必须实现  Serializable 接口(标记接口)

ObjectOutPutStream:

    构造方法: ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。

    一般方法:void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
                 该方法用于向文件中写入对象数据,与ObjectInputStream的 readObject方法配套使用。

         另有其他存入各种数据的方法(与基本数据类型流同),和继承自OutputStream的方法,自行查阅文档。

ObjectInputStream:

    构造方法: ObjectInputStream(InputStream in)创建读取指定 InputStream 的 objectInputStream。

    一般方法: Object readObject() 从 ObjectInputStream 读取对象。
                  该方法用于从文件中读取对象数据,与ObjectOutputStream的 writeObject方法配套使用。

        另有其他取出各种数据的方法(与基本数据类型流同),和继承自OutputStream的方法,自行查阅文档。

Serializable

    一个标记接口,只有实现了该接口的类的对象才拥有被序列化,持久化的能力。该接口没有扩展功能。

    实现了该接口的类,其中的静态成员也不能被序列化。

    对于实现了该接口,其中有非静态,但是又不想被持久化的成员,我们可以使用 transient 关键字修饰它。

    该接口通过类中的成员来计算一个标记值,成员有任何改动都会改变这个值,类和其对象都被该值标记,只有标记值相同的才能认为是对象属于该类。

    我们可以使用在类中 (ANY-ACCESS-MODIFIER) static final long serialVersionUID = 42L; 来给成员修饰符固定一个标记值,此时成员的修饰符的
      改变不再影响最终标记值的数值。使得我们对类的成员修饰符做了一定改动后,依然可以通过该类识别器原先固化的对象。

二、管道流。

    输入输出可以相互连接的流。通常由一个线程的 PipedInputStream读取数据(从管道),之后由另一个流的 PipedOutputStream 输出数据(到管道),
    如果两个流在同一个对象中存在,容易发生阻塞。

PipedInputStream

    构造方法: PipedInputStream() 创建尚未连接的 PipedInputStream

          PipedInputStream(PipedOutputStream pout)创建 PipedInputStream,使其连接到管道输出流 pout。

    连接方法: void connect(PipedOutputStream src) 使此管道输入流连接到管道输出流 src。

    其他方法: int available() 返回可以不受阻塞地从此输入流中读取的字节数 。

PipedOutputStream

    构造方法: PipedOutputStream() 创建尚未连接的 PipedOutputStream

          PipedOutputStream(PipedInputStream pin)创建PipedOutputStream,使其连接到管道输出流 pin。

    连接方法: void connect(PipedInputStream pin) 使此管道输入流连接到管道输出流 in。

    他们都是字节输入输出流的子类,其可以使用InputStream 和 OutputStream的共性方法。

三、RandomAccessFile类

    该类可以根据构造函数传入的参数不同实现同时对文件进行读写功能,并能以字节的形式访问文件中的指定位置(类似于将文件看做一个大型的byte数组,
      从第一个字节开始排列(一个汉子两个字节,字母一个字节,按照gbk排列))。
    该类不是io体系中的成员,其内部已经封装了输入输出字节流,

    构造函数: RandomAccessFile(File file, String mode) 创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定
                              参数 mode为 r表示只读, 为rw表示读写。
          RandomAccessFile(String fileName, String mode)创建一个随机读取文件流,文件本身有fileName指定。
                              参数 mode为 r表示只读, 为rw表示读写。

        当只传入r的时候,代表流对象为只读对象,此时传入的文件必须是存在的文件。否则会有异常。
        当传入参数为rw时,代表流对象为读写对象,此时文件若存在则指向该文件,否则创建一个该文件(不会覆盖)

    其他方法: 其基本read,write,close方法与FileInputStream和FileOutputStream相同。

         int readInt() 从此文件读取一个有符号的 32 位整数。 (另有对应其他基本数据类型的相关方法)。

           String readLine() 从此文件读取文本的下一行。

         void writeInt(int v) 按四个字节将 int 写入该文件,先写高字节。(另有相对应的其他数据类型方法)。

         int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。

           long getFilePointer() 返回此文件中的当前偏移量。(即当前指针位置。)

           void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
                (此方法方便常用,重点掌握)。此方法配合写入方法,可以修改文件局部内容。
                                 此方法配合读取方法可以获取文件局部内容。

四、基本数据类型流

专门进行基本数据类型操作的流。

  DateOutputStream:

    构造方法: DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流

    特有方法: int size() 返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数

          void writeInt(int v) 将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
                    存入一个int数据,类似方法还有对: short,float,double,boolean
                    dyte,char,long 等所有基本数据类型, 和String 的操作方法。

          void writeUTF(String str) 以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
                   使用该方法存入的数据必须使用 readUTF()方法读取。

    注意:类ObjectOutputStream、 RandomAccessFile也具有上述除 size以外的所有功能。

  DateInputStream:

    构造方法:DateInputStream(InputStream in) 创建一个新的数据输入流,从指定基础输入流中读取数据。

    特有方法:
         int readInt() 读入一个int类型的值,就是读取四个字节。
                读取一个int数据,类似方法还有对: short,float,double,boolean
                dyte,char,long 等所有基本数据类型, 和String 的操作方法。

           void readUTF() 以与机器无关方式使用 UTF-8 修改版编码从一个基础输入流中读取字符串。
                该方法必须读取的是使用 writeUTF方法写入的数据。

    注意: 类ObjectInputStream、 RandomAccessFile也具有上述全部功能。

  注意: 使用读取类型的方法的顺序,必须与写入该文件的方法顺序相同,否则会读取失败。

五、ByteArrayStream

  此类流的源和目的都是数组,没有涉及到系统底层资源, 该类没有close方法。

      ByteArrayInputStream: 该流对象在建立的时候,需要接收一个数据源,该源是一个字节数组。

      ByteArrayOutputStream: 该流对象在建立的时候,不需要指定数据目的,因为该对象内部封装了一个可变长度的byte数组。

    特有方法: void reset()  将此 byte 数组输出流的 count 字段重置为零,从而丢弃输出流中目前已累积的所有输出。

          int size()  返回缓冲区的当前大小。

         void writeTo(OutputStream out)  将此 byte 数组输出流的全部内容写入到指定的输出流参数中,
                这与使用 out.write(buf, 0, count) 调用该输出流的 write 方法效果一样。(此方法涉及异常)

其他方法与基本字节流 基本相同。

另外: 有CharArrayReader和CharArrayWriter,
        StringReader 和 StringWriter

  都是相应的源和目的都是内存的输入输出流,方法功能大致与字节数组流相当。

时间: 2024-10-12 21:05:33

io系列之常用流二的相关文章

io系列之常用流一

一. 读取键盘录入和数据打印 在System类中, System.out: 对应的是标准输出设备(控制台)(一个PrintStream). System.in: 对应的是标准输入设备(键盘)(一个InPutStream). 由System.in的定义可知 :public static final InputStream in : in属性本身是一个字节输入流对象,  可有: InputStream in = System.in; 其read方法是读入一个从键盘上输入的字节. 由System.ou

io系列之字符流

java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,java中将这种操作行为本身封装为对象,以供使用. Input and Output java将io流对象都在IO包中.(java.IO.*) 分类: 按照数据种类分: 字节流 和 字符流, 按照数据流向分: 输出流 和 输入流. 字节流抽象类: InputStream OutputStream 字符流

10.4-全栈Java笔记:常用流详解(二)

上节我们讲到「Java中常用流:文件字节流和字节数组流」,本节我们继续走起~  缓冲流 BufferedInputStream和BufferedOutputStream这两个流是处理流,通过内部缓存数组来提高操作流的效率. [示例1]使用缓冲流实现文件的高效率复制操作 public class Demo06 { public static void main(String[] args) { new Demo06().copyFile("d:/a.txt", "d:/b.tx

Java IO流(二)

目录 Java IO流(二) 7. 字节缓冲流 7.1 概述 7.2 BufferedOutputStream类 7.3 BufferedInputStream类 8. 文件复制练习(增强版 使用缓冲流) 9. 字符缓冲流 9.1 BufferedWriter类 9.2 BufferedReader类 10. 练习:文本排序 11. 转换流 11.1 字符编码和字符集 11.2 编码引出的问题 11.3 转换流的原理 11.4 OutputStreamWriter类 11.5 InputStre

Java NIO系列教程(十二) Java NIO与IO

当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异. IO                NIO 面向流            面向缓冲 阻塞IO           非阻塞IO 无 选择器 面向流与面向缓冲 Java NIO

SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)

原文:SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行) 前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块的内容,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲言少叙,进入本篇的内容. 技术准备 数据库版本为SQL Server2012,利用微软的以前的案例库(Northwind)进行分析,

MySQL高可用系列之MHA(二)

一.参数说明 MHA提供了一系列配置参数,深入理解每个参数的具体含义,对优化配置.合理使用MHA非常重要,很多高可用性也都是通过合理配置一些参数而实现的. MHA包括如下配置参数,分别说明如下: hostname/ip/port (Local Only) hostname为MySQL Server的IP地址或主机名: ip为MySQL Server的IP地址,缺省从$hostname中获取:port为MySQL Server的端口号,缺省为3306 ssh_host/ssh_ip/ssh_por

JAVA IO 字节流与字符流

文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.       IO框架 从上图我们可以看出IO可以分为两大块 字节流和字符流 字节流是 InputStream 和 OutputStream 分别对应输入与输出 字符流是Reader和Writer分别对应输入与输出        ByteArrayInputStream  它字节数组输入流.继承于InputS

java io系列01之 "目录"

javaIO系列转载出处:http://www.cnblogs.com/skywang12345/p/io_01.html 该分类所有博文,均转载同一作者,后边不再累赘标名. java io 系列目录如下: 01. java io系列01之  "目录" 02. java io系列02之 ByteArrayInputStream的简介,源码分析和示例(包括InputStream) 03. java io系列03之 ByteArrayOutputStream的简介,源码分析和示例(包括Ou