JavaIO基础
在java程序中,对于数据的输入/输出操作以“流”(stream)方式进行:J2SDK提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据。
java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能
按数据流的方向不同可以分为输入流和输出流,输入流和输出流的说法都是站在该程序的角度上看的。
按处理数据单位不同可以分为字节流和字符流。字节流是最原始的流,读出的数据是0和1的组合,8位一个字节。字符流是一个字符一个字符的往外读,两个字节为一个字符。
按功能的不同可以分为节点流和处理流。节点流为可以从一个特定的数据源(节点)读写数据(如:文件,内存)。处理流是“链接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
J2SDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象类型
- InputStream:输入流、字节流
- OutputStream:输出流、字节流
- Reader:输入流、字符流
- Writer:输出流、字符流
InputStream
继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit)。
int read() throws IOException
int read(byte[] buffer) throws IOException
int read(byte[] buffer,int offset,int length) throws IOException
void close() throws IOException
long skip(long n) throws IOException
OutputStream
继承自OutputStream的流都是用于向程序中输出数据,且数据的单位为字节(8bit)。
void write(int b) throws IOException
void write(byte[] b) throws IOException
void write(byte[] b,int off,int len) throws IOException
void close() throws IOException
void flush() throws IOException
Reader
继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)。
int read() throws IOException
int read(char[] cbuf) throws IOException
int read(char[] cbuf,int offset,int length) throws IOException
void close() throws IOException
long skip(long n) throws IOException
Writer
继承自Writer的流都是用于向程序中输出数据,且数据的单位为字符(16bit)。
void write(int c) throws IOException
void write(char[] cbuf) throws IOException
void write(char[] cbuf,int offset,int length) throws IOException
void write(String string) throws IOException
void write(String string,int offset,int length) throws IOException
void close() throws IOException
void flush() throws IOException
缓冲流
缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。
BufferedReader(Reader in)
BufferedReader(Reader in,int sz)//sz 为自定义缓冲区的大小
BufferedWriter(Writer out)
BufferedWriter(Writer out,int sz)
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
BufferedOutputStream(OutputStream out)
BufferedOutputStream(OutputStream out,int size)
缓冲输入流支持其父类的mark和reset方法
BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔)
BufferedWriter提供了newLine用于写入一个行分隔符
对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。
转换流
InputStreamReader和OutputStreamWriter用于字节数据到字符数据之间的转换。
InputStreamReader需要和InputStream“套接”
OutputStreamWriter需要和OutputStream“套接”
转换流在构造时可以指定其编码集合
数据流(先写的先读)
DataInputStream和DataOutputStream分别继承自InputStream和OutputStream,他属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流觞
DataInputStream和DataOutStream提供了可以存取与机器无关的java原始类型数据(如:int,double等)的方法
- DataInputStream(InputStream in)
- DataOutputStream(OutputStream out)
Print流(打印流)
PrintWriter和PrintStream都属于输出流,分别针对于字符和字节。
PrintWriter和PrintStream提供了重载的Print。
Println方法用于多种数据类型的输出。
PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。
PrintWriter和PrintStream有自动flush功能。
PrintWriter(Writer out)
PrintWriter(Writer out,boolean autoFlush)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out,boolean autoFlush)
PrintStream(OutputStream out)
PrintStream(OutputStream out,boolean autoFlush)
Object流
直接将Object写入或读出
Serializable接口(没有定义方法的接口,标记性的接口,告诉编译器实现该接口的类可以序列化)。
transient:透明的(在序列化的时候不考虑),可以修饰成员变量
externalizable接口:Serializable的子接口,控制序列化过程。