复习15:IO

IO

输入与输出

无论是输入还是输出,执行操作的对象都是程序

  • Input:读,将外部数据输入到程序
  • output:写,将程序数据输出到外部文件

IO实现了内存与磁盘之间的交互,即软-硬件交互,需要消耗大量的资源,所以无论是读还是写,都需要在完成操作之后关闭流对象,避免占用过多资源

流的类别

以基本单位作为分类
  • 字节流:读取数据的基本单位是字节。以下是字节流的父接口:
    • 读:InputStream
    • 写:outputStream
  • 字符流:读取数据的基本单位是字符,由于字符由字节组成,所以字符流的底层也是字节流。以下是字符流的父接口:
    • 读:reader
    • 写:writer
以构造器分类
  • 节点流
  • 包装流:节点流增强

字节流和字符流的读、写类都是抽象类,我们实际用到的都是它们的子类

流的读写操作都是单向的,这是与RandomAccessFile的最大区别


字节流(以下均为字节流)

字节流的常用子类

  • FileInputStream
  • BufferInputStream
  • ObjectInputStream

  • FileOutputStream
  • BufferOutputStream
  • ObjectOutputStream

普通字节输入/输出流

FileInputStream

常用API

  • FileInputStream(File file):构造方法
  • FileInputStream(String path):构造方法
  • int read():从此文件中读取一个字节的数据
  • int read(byte[ ] b):将最多[b.length]个字节长度的数据从文件读入[b]数组中
  • int read(byte[ ] b,int off,int len):从[off]位置开始,将[len]个字节长度的数据读入[b]数组中
  • int read[基本数据类型]:读取指定类型的数据,每次读取的长度与指定类型相同,示例:readInt(int i)
  • int available():返回值表示还剩余多少字节未读
  • long skip(long n):跳过并丢弃n个字节的数据
  • void close():将缓冲区刷新,并将其中所有内容输出到文件,然后再关闭
FileOutputStream

常用API

  • FileOutputStream(File file):通过传入一个文件对象创建一个IO流对象
  • FileOutputStream(File file,boolean append):[append]为true表示文件末尾追加输入新内容;反之,新内容会清空之前被写入的内容,默认是false
  • FileOutputStream(String path)
  • FileOutputStream(String path,boolean append)
  • void write(int b):向此文件中写入指定字节
  • void write(byte[] b)
  • void write(byte b,int off,int len):从[off]位置开始,将[b]数组中的[len]个长度的字节写入写入文件
  • void write[基本数据类型]:写入指定类型的数据,每次写入的长度与指定类型相同,示例:writeInt(int i)
  • void flush():刷新缓冲流,将缓冲流中的内容写入文件
  • void close():将缓冲区刷新,并将其中所有内容输出到文件,然后再关闭

缓冲流:程序数据—>缓冲流—>flush()—>文件


缓冲字节输入/输出流

字节流的加强版,用法与字节流相同,运行速度更快

  • 读:BufferedInputStream
  • 写:BufferedOutputStream
缓冲字节输入/输出流的特点

普通字节流:每读取一次规定长度的字符就要与文件直接交互一次,假如有1000个字符,每次读取一个字符,那么就会发生1000次交互。

缓冲字符流:在内存中创建了一个缓冲区(只有程序可见),文件中的字节按照读取规则被添加进缓冲区中,而不与程序直接交互;当缓冲区的空间被填满之后,缓冲区将所有字节数据传递给程序。如此一来,减少了交互次数,提高了效率。

输出流按照输出规则将字节添加进缓冲区,缓冲区满了之后再写入文件

BufferedInputStream

常用API

  • BufferedInputStream(InputStream inputStream)
  • BufferedInputStream(InputStream inputStream,int size):自定义缓冲区的大小

其余API均与FileInputStream相同

BufferedInputStream

常用API

  • BufferedOutputStream(OutputStream outputStream)
  • BufferedOutputStream(OutputStream outputStream,int size):自定义缓冲区的大小

其余API均与FileOutputStream相同


对象流

顾名思义,以对象为操作对象进行读写的流

  • 读:ObjectInputStream
  • 写:ObjectOutputStream

序列化:将对象转化成字节的过程(对象类必须实现Serializable接口)

持久化:将字节存储到文件系统中的过程

Serializable:没有任何字段和方法,实现该接口的类可启用序列化功能,未实现该接口的类不能进行序列化或者反序列化。

对象流的作用

多个用户共享对象数据

对象流的特点
  • !!!被传输的对象必须实现Serializable接口
  • 写之后、读之前该对象类不能发生变化(字段名、字段个数、字段内容、方法名、方法个数、方法内容),除非指定serialVersionUID

关键字:transient

  • 作用:在序列化时,会忽略被该关键字修饰的字段的属性值

serialVersionUID:版本号,判断对象类与流中的对象是否一致的标准。

  • 若不指定,则会默认生成,每一次修改对象类都会导致版本号发生改变,所以这种情况下写入对象之后不能修改对象类;
  • 若指定,版本号不会随对象类的修改而改变,所以这种情况下写入对象之后可以修改对象类(字段、方法都可修改)
    • 读取到的字段比对象类多:多出来的字段被舍弃
    • 读取到的字段比对象类少:补上少的那部分字段,并设置默认值
ObjectInputStream

常用API

  • ObjectInputStream(InputStream inputStream)
  • int read():从此文件中读取一个字节的数据
  • int read(byte[ ] b):将最多[b.length]个字节长度的数据从文件读入[b]数组中
  • int read(byte[ ] b,int off,int len):从[off]位置开始,将[len]个字节长度的数据读入[b]数组中
  • int read[基本数据类型]:读取指定类型的数据,每次读取的长度与指定类型相同,示例:readInt(int i)
  • Object readObject():读取对象,需要进行强制类型转换
  • void close()
ObjectOutputStream

常用API

  • ObjectOutputStream(OutputStream outputStream)
  • void write(int b):向此文件中写入指定字节
  • v oid write(byte[] b)
  • void write(byte b,int off,int len):从[off]位置开始,将[b]数组中的[len]个长度的字节写入写入文件
  • void write[基本数据类型]:写入指定类型的数据,每次写入的长度与指定类型相同,示例:writeInt(int i)
  • writeObject(Object o):写入指定的对象,被写入的对象类型默认转换成Object
  • void close()

字符流(以下均为字符流)

字节流的常用子类

读:

  • InputStreamReader
  • BufferedReader

写:

  • OutputStreamReader
  • PrintWriter

普通字节输入/输出流

InputStreamReader

常用API

  • InputStreamReader(InputStream in)

  • InputStreamReader(InputStream in,Charset charset):以指定编码方式创建对象(需要传入一个编码集对象)

  • InputStreamReader(InputStream in,String charsetName):以指定编码方式创建对象(传入对应编码集的名称)

  • int read():读取单个字符

  • int read(char[] chars):将[chars.length]个长度的字符读取到[chars]数组

  • int read(char[] chars,int off,int len):从数组的[off]位置开始,将[len]个长度的字符读入[chars]数组

  • getEncoding():获取此流使用的字符集的名称

  • close()

所有转义字符,包括空格都会被完整地读取

OutputStreamWriter

常用API

  • OutputStreamWriter(OutputStream in)

  • OutputStreamWriter(OutputStream in,Charset charset):以指定编码方式创建对象(需要传入一个编码集对象)

  • OutputStreamWriter(OutputStream in,String charsetName):以指定编码方式创建对象(传入对应编码集的名称)

  • int write(char c):写入单个字符

  • int write(char[] chars):将[chars]中的内容写入文件

  • int write(char[] chars,int off,int len):从[chars]数组的[off]位置开始,将[len]个长度的字符写入文件

  • int write(String str):写入一个字符串

  • int write(String str,int off,int len):从[str]字符串的[off]位置开始,将[len]个长度的字符写入文件

  • getEncoding()

  • close()

  • flush():刷新缓冲流


缓冲字符输入/输出流

BufferedReader

常用API

  • !!!BufferedReader(Reader in):默认缓冲区大小

  • BufferedReader(Reader in,int size):自定义缓冲区大小

  • read(…):参照InputStreamReader

  • String readLine():整行读取,当返回值为null时表示读取结束

PrintWriter

常用API

构造方法(极其重要):

  • PrintWrite(File file)
  • PrintWrite(File file,String charsetName)
  • PrintWrite(String filePath)
  • PrintWrite(String filePath,String charsetName)
  • PrintWrite(OutputStream outputStream)
  • PrintWrite(OutputStream outputStream,boolean autoFlush):默认为false,自动刷新缓冲区(println()有效,print()无效)
  • PrintWrite(Writer writer)
  • PrintWrite(Writer writer,boolean autoFlush)
  • 能指定字符集的,不能追加内容
  • 能追加内容的,不能指定字符集

读写操作:

  • write(…):参照OutputStreamWriter
  • print(…):将指定字符串输出到缓冲区中,执行之后需要刷新缓冲区才能将数据输出到文件中(直接关闭流也可行)
  • println(…):在print()的基础上增加换行功能,使用该方法时必须刷新缓冲区(仅使用close()无效)
  • append(char c):追加字符
  • append(String str):追加字符串
  • append(String str,int start,int end):截取[start]到[end]位置的字符串追加到文件中

print()和printl(…)均可以接收八大数据类型和String类型


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章