IO流

Posted lytwajue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO流相关的知识,希望对你有一定的参考价值。

IO流

1.流的分类:
依照数据流向的不同:输入流  输出流
依照处理数据的单位的不同:字节流(处理二进制文件)  字符流(处理的文本文件)
依照角色的不同:节点流(直接作用于文件的)  处理流(作用于节点流或处理流)

2.IO的体系
抽象基类  >>节点流(文件流)       >>         缓冲流(处理流的一种)
InputStream  >> FileInputStream  >>  BufferedInputStream
OutputStream  >> FileOutputStream  >> BufferedOutputStream
Reader  >> FileReader  >> BufferedReader
Writer  >> FileWriter  >> BufferedWriter

3.经常用法
①。

FileInputStream
    public int read():读取一个字节,如没有则返回-1
    public int read(byte[] b):读取一个字节数组,如没有返回-1(经常使用byte[1024])
    public int read(byte[] b, int off, int len):读取指定长度的字节数组。如没有返回-1
    public void close():关闭字节流
②。

FileOutputStream
    public void write(int b):写入一个字节
    public void write(byte[] b):写入一个字节数组
    public void write(byte[] b,int off,  int len):写入指定长度是字节数组(经常使用)
    public void close():关闭输出流
③。

FileReader
    public int read():读取一个字符,如没有则返回-1
    public int read(char[] c):读取一个字符数组,如没有返回-1(经常使用byte[1024])
    public int read(char[] c, int off, int len):读取指定长度的字符数组,如没有返回-1
    public void close():关闭字符流
④。FileWriter
    public void write(int c):写入一个字符
    public void write(byte[] c):写入一个字符数组
    public void write(byte[] c,int off,  int len):写入指定长度是字符数组(经常使用)
    public void close():关闭输出流
⑤。BufferedInputStream
    public int read():读取一个字节,如没有则返回-1
    public int read(byte[] b):读取一个字节数组,如没有返回-1(经常使用byte[1024])
    public int read(byte[] b, int off, int len):读取指定长度的字节数组,如没有返回-1
    public void close():关闭输入缓冲流,也会把字节流关闭
⑥。

BufferedOutputStream
    public void write(int b):写入一个字节
    public void write(byte[] b):写入一个字节数组
    public void write(byte[] b,int off,  int len):写入指定长度是字节数组(经常使用)
    public void close():关闭输出缓冲流。也会把字节流关闭
⑦。BufferedReader
    public int read():读取一个字符。如没有则返回-1
    public int read(char[] c):读取一个字符数组,如没有返回-1(经常使用byte[1024])
    public int read(char[] c, int off, int len):读取指定长度的字符数组,如没有返回-1
    public String readLine():读入一行数据,返回一个字符串。如没有数据。则返回null
    public void close():关闭输入缓冲流,也会把字节流关闭
⑧。

BufferedWriter
    public void write(int c):写入一个字符
    public void write(byte[] c):写入一个字符数组
    public void write(byte[] c,int off,  int len):写入指定长度是字符数组(经常使用)
    public void write(String s, int off, int len):写入指定长度是字符数组(经常使用)
    public void close():关闭输出缓冲流,也会把字节流关闭
    public void flush():刷新输出缓冲流
    public void newLine():换行

4.其它流
①。转换流:实现字节流与字符流之间的转换
    InputStreamReader:解码:字节数组--->字符串
    OutputStreamWriter:解码:字节数组--->字符串
②。

标准的输入输出流:
    标准的输出流:System.out:默认输出到控制台
    标准的输入流:System.in:从键盘读取输入数据
③。打印流
    字节流:PrintStream
    字符流:PrintWriter
④。

数据流:用来处理基本数据类型、String、字节数组的数据:
    DataInputStream
    DataOutputStream
    用数据流写入的数据。应该用数据流读出,否则可能出现乱码
5.对象流
ObjectInputStream和ObjectOutputSteam
用于存储和读取对象的处理流。

它的强大之处就是能够把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化(Serialize):用ObjectOutputStream类将一个Java对象写入IO流中
反序列化(Deserialize):用ObjectInputStream类从IO流中恢复该Java对象
ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
①。

对象序列化机制
同意把内存中的Java对象转换成平台无关的二进制流,从而同意把这样的二进制流持久地保存在磁盘上。或通过网络将这样的二进制流传输到还有一个网络节点。


当其他程序获取了这样的二进制流,就能够恢复成原来的Java对象

序列化的优点在于可将不论什么实现了Serializable接口的对象转化为字节数据,使其在保存和传输时可被还原
序列化是 RMI(Remote Method Invoke – 远程方法调用)过程的參数和返回值都必须实现的机制,而 RMI 是 JavaEE 的基础。因此序列化机制是 JavaEE 平台的基础
假设须要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现例如以下两个接口之中的一个:Serializable或Externalizable

②。

凡是实现Serializable接口的类都有一个表示序列化版本号标识符的静态变量:
private static final long serialVersionUID;
serialVersionUID用来表明类的不同版本号间的兼容性
假设类没有显示定义这个静态变量,它的值是Java执行时环境依据类的内部细节自己主动生成的。

若类的源码作了改动,serialVersionUID 可能发生变化。

故建议。显示声明
显示定义serialVersionUID的用途
希望类的不同版本号对序列化兼容,因此需确保类的不同版本号具有同样的serialVersionUID
不希望类的不同版本号对序列化兼容,因此需确保类的不同版本号具有不同的serialVersionUID

③。

若某个类实现了 Serializable 接口,该类的对象就是可序列化的:
创建一个 ObjectOutputStream
调用 ObjectOutputStream 对象的 writeObject(对象) 方法输出可序列化对象。注意写出一次。操作flush()
反序列化
创建一个 ObjectInputStream
调用 readObject() 方法读取流中的对象
强调:假设某个类的字段不是基本数据类型或 String  类型。而是还有一个引用类型。那么这个引用类型必须是可序列化的,否则拥有该类型的 Field 的类也不能序列化

6.RandomAccessFile 类支持 “随机訪问” 的方式,程序能够直接跳到文件的随意地方来读、写文件
   支持仅仅訪问文件的部分内容
   能够向已存在的文件后追加内容
①。

RandomAccessFile 对象包括一个记录指针。用以标示当前读写处的位置。RandomAccessFile 类对象能够自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置

②。

构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
 
创建 RandomAccessFile 类实例须要指定一个 mode 參数。该參数指定 RandomAccessFile 的訪问模式:
r: 以仅仅读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新

以上是关于IO流的主要内容,如果未能解决你的问题,请参考以下文章

IO流之IO流综述

IO异常--缓冲流--转换流--序列化流( IO流2 )

IO流(序列流)

java中的io流都有哪些

java IO流 IO流概述

IO流