java I/O 流
在java中对于数据的输入/输出都是以流(stream)的方式进行.流位于java.io包内;
输入/输出流分类:
java的流可以按照3种方式分类:
1.按照数据流方向可以分为输入流和输出流;
2.按照处理数据的长度可以分为字节流和字符流;
3.按照功能不同分为节点流和处理流(节点流字节面向文件,处理流面向节点流)
java所提供所有流类型分别继承于下面4种抽象流类型.
字节流 字符流
输入流 InputStream Reader
输出流 OutputStream Writer
InputStream:
//继承于InputStream的流都是字节流(8bit).
int read() throws IOExpception
//读取一个字节并以整数的形式返回(0-255)如果返回-1表示文件已经读完;
int read( byte[] buffer ) throws IOException
//读取一些字节并存储到字节数组buffer中,返回实际读取的字节数,如果读到输入流的末端返回-1
int read( byte[] buffer, int offset, int length )throws IOException
//读取length个字节,并存储到一个字节数组buffer,从offset位置开始读.
void close() throws IOExce[tion
//关闭并释放内存资源
long skip( long n ) throws IOException
//跳过N个字节不读,返回实际跳过的字节数.
OutputStream:
//继承于OutputStream的流都是字节流(8bit).
void write( int b ) throws IOExpception
//将指定的字节b写入此输出流,该字节为int类型的低8位;
void write(byte[] b, int off, int len) throws IOException
//将指定字节数组b中从偏移量 off 开始的 len 个字节写入此输出流
void close() throws IOExce[tion
//关闭并释放内存资源
void flush() throws IOException
//刷新此输出流并强制写出所有缓冲的输出字节.
//一个良好的编程习惯是:在任何close()之前都应该调用下flush();
Reader:
//继承于Reader的流都是字符流(16bit).
int read() throws IOExpception
//读取一个字符并以整数的形式返回(0-65535)如果返回-1表示文件已经读完;
int read( char[] buffer ) throws IOException
//读取一些字符并存储到字符数组buffer中,返回实际读取的字符数,如果读到输入流的末端返回-1
int read( byte[] buffer, int offset, int length )throws IOException
//读取length个字节,从offset位置开始读,并存储到一个字节数组buffer.
void close() throws IOExce[tion
//关闭并释放内存资源
long skip( long n ) throws IOException
//跳过N个字符不读,返回实际跳过的字节数.
Writer:
//继承于Writer的流都是字符流(16bit).
void write( int b ) throws IOExpception
//将指定的字符b写入此输出流,该字符为int类型的低16位;
void write(byte[] b, int off, int len) throws IOException
//将指定字符数组b中从偏移量 off 开始的 len 个字符写入此输出流
void write(String str) throws IOException
//将一个字符串写出去;
void close() throws IOExce[tion
//关闭并释放内存资源
void flush() throws IOException
//刷新此输出流并强制写出所有缓冲的输出字节.
//一个良好的编程习惯是:在任何close()之前都应该调用下flush();
节点流类型:
字节流:
1.FileInputStream和FileOutputStream
//节点流(同时也是字节流)读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
2.ByteArrayInputStream和ByteArrayOutputStream
//节点流(字节流)用于以IO流的方式来完成对字节数组内容读写,来支持类似内存虚拟文件或者内存映像文件的功能。
3.PipedInputStream和PipedOutputStream
//管道流(节点流)字节流,用于线程间的通信.一个线程的PipedInputStream对象从另一个线程的PipedOutputStream读取数据
字符流:
4.CharArrayReader和CharArrayWriter
//节点流(字符流)读取或往文件中写入字符流。如果在构造CharArrayWriter时,文件已经存在,则覆盖这个文件。
5.StringReader和StringWriter
//字符流;用StringReader从String中读取字符,用StringWriter写入一个String.StringWriter把字
//符写入一个StringBuffer对象,当然也可以用StringWriter.toString()方法将其转换成一个String.
6.PipedReader和PipedWriter
//节点流(字符流)管道流,用于线程间的通信。一个线程的PipedReader对象从另一个线程的PipedWrite读取数据(其实和上面的PipedInputStream差不多,只是操作的是字符.
处理流:
8bit类型(字节流):
BufferedInputStream( InputStream in )和BufferedOutputStream
//缓冲流,需要套接在节点流之上,缓冲流提高了读写效率,除了拥有InputStream和OutputStream的方法外,同时增加了一些新的方法.
boolean markSupported() throws IOEXception
//测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。
void mark(int readlimit) throws IOException
//在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记.
void reset() throws IOexception
//返回到上一个mark标记.
String readLine() throws IOexception
//读一行.
16bit(字符流)
BufferedReader和BufferedWriter
boolean markSupported() throws IOEXception
//测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。
void mark(int readlimit) throws IOException
//在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记.
void reset() throws IOexception
//返回到上一个mark标记.
void newLine() throws IOexception
//写入一个行分隔符
转换流(TransformIO):
//将字节流转换为字符流
InputStreamReader和OutputStreamWriter
//InputStreamReader可以把字节流转换成字符流处理;OutputStreamWriter则相反!
数据流(DataIO):
DataInputStream和DataOutputStream分别继承于InputStream和OutputStream,属于处理流必须套接在InputStream和OutputStream的节点流上.
DataInputStream和DataOutputStream可以读入和写入java的基础类型(int double );
Print流:
PrintWriter和PrintStream都属于输出流,分别针对字符和字节;
PrintWriter和PrintStream都提供了重载的print和println方法,用于多种数据类型的输出;
PrintWriter和PrintStream都不会抛异常,用户自己通过经验和检测错误状态来获取错误信息;
PrintWriter和PrintStream都有flush()功能,也就是说自动的调用flush();
Object流(Serializable序列化):
ObjectOutputStream和ObjectInputStream分别定义了写入对象和读入对象的功能.
transient(关键字):
可以修饰成员变量,修饰后的成员变量在序列化的时候不予以考虑.也就是说不写入.
serializable接口:
所有实现了serializable的接口都表示该对象是可以被序列化的(标记对象是否可以被序列化.
externalizable接口:
用serializable接口时是由编译器帮我们序列化过程,如果用externalizable的话是可以自己控制序列化过程!