InputStream
:将外部物理设备(磁盘,网络等)中的数据读取到程序(内存)中,OutputStream
:将程序中的数据输出到外部设备中。
流的分类
按操作数据的单位分类
:字节流(8bit,以byte为单位传输),字符流(16bit,以char为单位传输)按流的流向分类
:输入流和输出流按流的角色分类
:节点流和处理流
流体系
InputStream & Reader
- 在读取文件时,必须保证文件存在,否则会跑IO异常。
- 程序中所有的IO资源应该显示的关闭,因为它们不属于内存资源,GC无法回收。
int read(char [] c, int off, int len)
:读取字符到一个数组中的一部分。此方法将阻塞,直到有输入数据可用,发生I/ O错误,或者该流的末尾。返回已读取的字节数,如果已到达流的末尾将返回-1。
OutputStream & Writer
void write(int b/int c)
void write(byte[] b/char[] cbuf)
void write(byte[] b/char[] buff, int off, int len)
:将当前缓存buff中的数据写入到输出流中void flush()
:将缓存中的数据强制同步到底层流中,默认情况下,缓存区满的情况下才往流中写入。如果这时关闭流则会导致数据丢失。 具体请参考void close()
: 需要先刷新,再关闭此流
因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数
void write(String str)
void write(String str, int off, int len)
- 在写入一个文件时,如果目录下有同名文件将被覆盖。
缓冲流
根据数据操作单位可以把缓冲流分为:
- BufferedInputStream 和 BufferedOutputStream
- BufferedReader 和 BufferedWriter
- 缓冲流要"套接"在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法
- 对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出
public String readline()
:读取一行文本,如果到达流的结尾将返回null。bw.newLine()
:写入一个换行符
转换流
- 将字节流按照指定的编码转换为字符流,效率更加的高效。
- 需要用到字符编码的,参考
编码
:字符->字节数组解码
:字节数组->字符
标准输入输出流
System.in
:系统标准的输入设备,默认是键盘。类型为InputStream。System.out
:系统标准的输出设备,默认是显示屏。类型是PrintStream,其是OutputStream的子类FilterOutputStream 的子类。- 通过System类的setIn,setOut方法对默认设备进行改变。
public static void setIn(InputStream in)
public static void setOut(PrintStream out)
打印流
PrintStream
:字节打印流PrintWriter
:字符打印流- 不会抛出异常,可以设置第二个构造参数为true,表示自动flush()。写入换行符或
\n
时都会刷新缓存区到输出流。
RandomAccessFile类
- 支持随机访问的方式,程序可以直接跳到任意位置来读,写文件。如访问文件的部分内容,和向已经存在的文件中追加内容。
- RandomAccessFile类中包含一个
记录指针
,用来表示当前读写的位置。可以自由的移动指针来改变读取的位置long getFilePointer()
:获取文件记录指针的当前位置void seek(long pos)
:将文件记录指针定位到 pos 位置
- 构造器
- public RandomAccessFile(File file, String mode)
- public RandomAccessFile(String name, String mode)
- mode表示访问模式
r
: 以只读方式打开,调用write方法将会抛出IOException。rw
:打开以便读取和写入rwd
:打开以便读取和写入;同步文件内容的更新(默认情形下(rw模式下),是使用buffer的,只有cache满的或者使用RandomAccessFile.close()关闭流的时候儿才真正的写到文件)rws
:打开以便读取和写入;同步文件内容和元数据的更新