简介:I/O是Input/Output的缩写,I/O集数是十分实用的技术,用于处理数据传输。如读写文件,网络通讯等。在java中对于数据的输入/输出操作以“流(stream)”的方式进行,在java.io包下提供了各种“流”类和接口,用来获取不同种类的数据,并通过方法输入或输出数据。
流:个人理解为数据在程序和文件之间的路径。
1)按流向不同分类:将数据从java程序(内存)写入文件(磁盘)为输出流,反之从文件读入为输入流。
2)按操作数据单位分类:字节流(8bit)字符流(按字符-----跟文件编码方式有关)
3)按流的角色分类:节点流,处理流/包装流
常用类体系图如下:
字节输入流 InputStream
常用的子类:
1.FilelnputStream:文件输入流
2.BufferedlnputStream:缓冲字节输入流
3.ObjectlnputStream:对象字节输入流
常用方法:
read()
:返回输入流中下一个字节的数据。返回的值介于 0 到 255 之间。如果未读取任何字节,则代码返回-1
,表示文件结束。
skip(long n)
:忽略输入流中的 n 个字节 ,返回实际忽略的字节数。available()
:返回输入流中可以读取的字节数。close()
:关闭输入流释放相关的系统资源。readAllBytes()
:读取输入流中的所有字节,返回字节数组。readNBytes(byte[] b, int off, int len)
:阻塞直到读取len
个字节。transferTo(OutputStream out)
: 将所有字节从一个输入流传递到一个输出流。
字节输出流Outputstream
常用方法 :
write()
:将指定参数写入输出流。flush()
:刷新此输出流并强制写出所有缓冲的输出字节。close()
:关闭输出流释放相关的系统资源。
字符输入流Reader
Reader
用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader
抽象类是所有字符输入流的父类。
常用方法:
write(int b)
:将特定字节写入输出流。write(byte b[ ])
: 将数组b
写入到输出流,等价于write(b, 0, b.length)
。write(byte[] b, int off, int len)
: 在write(byte b[ ])
方法的基础上增加了off
参数(偏移量)和len
参数(要读取的最大字节数)。flush()
:刷新此输出流并强制写出所有缓冲的输出字节。close()
:关闭输出流释放相关的系统资源。
字符输出流Writer
Writer
用于将数据(字符信息)写入到目的地(通常是文件),java.io.Writer
抽象类是所有字符输出流的父类。
read()
: 从输入流读取一个字符。read(char[] cbuf)
: 从输入流中读取一些字符,并将它们存储到字符数组cbuf
中,等价于read(cbuf, 0, cbuf.length)
。read(char[] cbuf, int off, int len)
:在read(char[] cbuf)
方法的基础上增加了off
参数(偏移量)和len
参数(要读取的最大字符数)。skip(long n)
:忽略输入流中的 n 个字符 ,返回实际忽略的字符数。close()
: 关闭输入流并释放相关的系统资源。
文章较多参考JavaGuide网站的io目录
总结:1注意文件/文件夹创建失败的情况,应用try(){...}catch(){}处理异常。
2四大抽象类名为其相关子类名的后缀,方便记忆
3各种类方法有一定程度上的重合,注意触类旁通
4以“套娃”(在存在的流(节点流或处理流)之上)理解Buffer的各种类方法,更好理解它的高效
5输入输出站在程序的角度更好理解
6对象流在序列化的应用