输入输出流

  • I/O流的概念
  • InputStream
  • OutputStream
  • Reader
  • Writer
  • InputStreamReader
  • OutputStreamWriter
  •  

  • Java为输入输出准备了繁杂的编程接口,结合文件系统和网络通信的知识,可以开发出许许多多精彩纷呈的应用程序。
  • Java中主要有4个输入输出的抽象类,InputStream、OutputStream、Reader和Writer。
  • 字节流:InputStream和OutputStream。
  • 字符流:Reader和Writer。
  • ObjectInputStream和ObjectOutputStream分别继承自InputStream和OutputStream,用于从输入流读取Java对象和向输出流中输出Java对象。
  • 可以被输入输出的对象必须实现Serializable接口,即实现序列化。
  •  

  • InputStream是一个抽象类,它是所有面向字节的输入流的父类。
  • InputStream的主要方法有:
    • int read(byte[] b) —— 读取字节到字节数组中,返回读取的字节数。
    • int read(byte[] b, int off, int len) —— 读取最多len个字节到字节数组b中,在字节数组b中从 下标off开始存放,返回值是实际读取的字节数。
    • void close() —— 关闭输入流,并释放关联的资源。
    • long skip(long n) —— 跳过n个字节。
  • OutputStream是一个抽象类,它是所有面向字节的输出流的父类。
  • OutputStream的主要方法有:
    • void write(byte[] b) —— 将字节数组输出到输出流。
    • void write(byte[] b, int off, int len) —— 输出字节数组b中从下标off开始的len个字节。
    • void close() —— 关闭输出流,并释放关联的资源。
    • void flush() —— 刷新输出流,迫使缓冲的字节输出。
  • Reader是一个抽象类,它是所有面向字符的输入流的父类。
  • Reader的主要方法有:
    • int read(char[] cbuf) —— 将字符读到数组中。
    • abstract int read(char[] cbuf, int off, int len) —— 将len长的字符读到数组中下标off开始的数组元素中。
    • void close() —— 关闭输入字符流,并释放关联的资源。
  • Writer是一个抽象类,它是所有面向字符的输出流的父类。
  • Writer的主要方法有:
    • void write(char[] cbuf) —— 输出字符数组。
    • void write(char[] cbuf, int off, int len) —— 输出字符数组中指定的字符。
    • void write(String str) —— 输出一个字符串。
    • void write(String str, int off, int len) —— 输出一个字符串的子串。
    • abstract void flush() —— 刷新输出流。
    • abstract void close() —— 关闭输出流。
  • InputStreamReader是从字节流向字符流转化的桥梁。
  • InputStreamReader读取字节,使用 特定的字符集解码成字符。
  • InputStreamReader的主要方法有:
    • InputStreamReader(InputStream in) —— 使用系统默认字符集构建InputStreamReader。
    • InputStreamReader(InputStream in, Charset cs) —— 使用给定的字符集构建InputStreamReader。
    • InputStreamReader(InputStream in, String charsetName) —— 使用字符集名称构建InputStreamReader。
    • int read(char[] cbuf, int offset, int length) —— 读入字符到字符数组中的指定位置。
    • String getEncoding() —— 返回字符集的名称。
    • void close() —— 关闭输入流。
  • OutputStreamWriter是字符流向字节流转换的桥梁。
  • 写入OutputStreamWriter的字符将被使用特定的字符集编码成字节。
  • OutputStreamWriter主要的方法有:
    • OutputStreamWriter(OutputStream out) —— 创建一个使用默认字符集编码的OutputStreamWriter。
    • OutputStreamWriter(OutputStream out, Charset cs) —— 创建指定字符集的OutputStreamWriter。
    • OutputStreamWriter(OutputStream out, String charsetName) —— 创建指定字符集名称的OutputStreamWriter。
    • void write(char[] cbuf, int off, int len) —— 输出字符数组的一部分。
    • void write(String str, int off, int len) —— 输出字符串的一部分。
  • 文本文件读写

    • FileReader —— 从文本文件中读取字符。
    • FileWriter —— 创建文本文件并往其中写入字符数据。
    • BufferedReader —— 有缓冲,具有readLine()方法,可以对换行符进行鉴别,一行一行地读取。
    • BufferedWriter —— 有缓冲,具有newLine()方法,可以写入换行符。

    二进制文件的读写

    • FileInputStream —— 从二进制文件读入字节流。
    • FileOutputStream —— 向二进制文件写入字节流。
    • BufferedInputStream —— 有缓冲的字节输入流。
    • BufferedOutputStream —— 有缓冲的字节输出流。

    随机文件读写

    • 随机读写是相对顺序读写而言的,所谓随机读写,是指可以在任何时候将存取文件的指针指向文件内容的任何位置。
    • RandomAccessFile —— Java用于支持随机文件读写的类,主要方法有:
      • RandomAccessFile(File file, String mode) —— mode为打开方式,"r"为只读,"rw"为读写。
      • void setLength(long newLength) —— 设置文件的长度。
      • void seek(long pos) —— 设置文件指针的位置,即从文件开始的偏移字节数。

    处理压缩文件

    • java.util.zip包中提供了一些类,可以处理压缩的输入输出流。
    • GZIPOutputStream和ZipOutputStream可分别把数据压缩成GZIP格式和Zip格式。
    • GZIPInputStream和ZipInputStream可以分别把压缩成GZIP或Zip的数据解压缩恢复原状。

    对象序列化的原理

    • 通过输出流保存的对象都获得一个序列号。
    • 当要保存一个对象时,先检查该对象是否被保存了。
    • 如果以前保存过,只需写入“与已经保存的具有序列号的对象相同”的标记;否则,保存该对象。
    • Java对象序列化机制专门设计了一个没有定义任何方法的Serializable接口,当一个Java对象实现该接口后,Java将为其提供一个唯一的序列号。

    对象序列化的概念

    • Java的对象序列化是一种使得对象能够被存储和被传输的一种机制。
    • 支持序列化的类需要实现Serializable接口,这个接口没有任何方法。
    • java.io包提供了对象输入输出流ObjectInputStream和ObjectOutputStream,可以直接把Java对象输入输出成字节流。
    • 这两个输入输出类不会保存和读取对象中的transient和static类型的变量,这使得我们可以选择性地存储必要的信息。
    • JDK提供的大多数类都实现了Serializable接口,这意味着它们的实例都能够被序列化,能够被存储和传输。
    • 一个Java类的实例能否被序列化,可以通过JDK的bin目录下的serialver命令来判断,例如serialver java.util.Vector。
    • 没有实现Serializable接口的类的实例,不能基于对象输入输出流进行存取,否则将抛出NotSerializableException。

    对象序列化的原理

    • 通过输出流保存的对象都获得一个序列号。
    • 当要保存一个对象时,先检查该对象是否被保存了。
    • 如果以前保存过,只需写入“与已经保存的具有序列号的对象相同”的标记;否则,保存该对象。
    • Java对象序列化机制专门设计了一个没有定义任何方法的Serializable接口,当一个Java对象实现该接口后,Java将为其提供一个唯一的序列号。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值