1.java流式输入/输出原理
在java程序中,对于数据的流入/输出操作以“流”(stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据。
2.java流类的分类
(1)java.io 包中定义了多个流类型(类或抽象)来实现输入/输出功能;可以从不同的角度对其进行分类:
(a)按数据流的方向不同可以分为输入流和输出流。(从程序角度看)
(b)按处理数据单位不同可以分为字节流和字符流。
(c)按照功能不同可以分为节点流和处理流。
(2)J2DSK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象类型。
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
3.输入/输出流类
(1)InputStream
继承InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。
基本方法:
//读取一个字节并以整个整数的形式返回(0-255)
//如果返回-1已到输入流末尾
int read() throws IOException
//读取一系列字节并储存到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,返回-1
int read(byte[] buffer) throws IOException
//读取length个字节
//并储存到一个字节数组buffer,从length位置开始
//返回实际读取的字节数,如果读取前以到输入流的末尾,返回-1
int read(byte[] buffer,int offset,int length) throws IOException
//关闭流释放内存资源
viod close() throws IOException
//跳过n个字节不读,返回实际跳过的字节数
long skip(long n) throws IOException
(2)OutputStream
继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。
基本方法:
//向输出流中写入一个字节数据,该字节数据为参数b的低8位
int write(int b) throws IOException
//将一个字节类型的数组中的数据写入输出流
int write(byte[] b) throws IOException
//将一个字节类型的数组中从指定位置(offset)开始的
//length个字节写入到输出流
int write(byte[] b,int offset,int length) throws IOException
//关闭流释放内存资源(写close方法前先写flush方法)
viod close() throws IOException
//将输出流中缓冲的数据全部写出到目的地
viod flush() throws IOException
(3)Reader
继承自Reader的流是用于程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。
基本方法:
//读取一个字符并以整个整数的形式返回(0-255)
//如果返回-1已到输入流末尾
int read() throws IOException
//读取一系列字符并储存到一个数组buffer
//返回实际读取的字符数,如果读取前已到输入流的末尾,返回-1
int read(char[] buffer) throws IOException
//读取length个字符
//并存储到一个数组buffer,从length位置开始
//返回实际读取的字符数,如果读取前以到输入流的末尾,返回-1
int read(char[] cbuf,int offset,int length) throws IOException
//关闭流释放内存资源
viod close() throws IOException
//跳过n个字节不读,返回实际跳过的字节数
long skip(long n) throws IOException
(4)Writer
继承自Writer的流是用于程序中输出数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。
基本方法:
//向输出流中写入一个字符数据,该字符数据为参数b的低16位
void write(int b) throws IOException
//将一个字符类型的数组中的数据写入输出流
void write(char[] cbuffer) throws IOException
//将一个字符类型的数组中从指定位置(offset)开始的
//length个字符写入到输出流
void write(char[] cbuffer,int offset,int length) throws IOException
//将一个字符串中的字符写入到输出流
void write(String string) throws IOException
//将一个字符串从offset开始的length个字符写入到输出流
void write(String string,int offset,int length) throws IOExption
//关闭流释放内存资源(写close方法前先写flush方法)
viod close() throws IOException
//将输出流中缓冲的数据全部写出到目的地
viod flush() throws IOException
4.常见的节点流和处理流
(1)节点流可以从一个特定的数据(节点)读写数据(如:文件,内存)。
(2)处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
5.文件流
(1)FileInputStream 和 FileOutputStream 分别继承 FileInputStream 和 FileOutputStream用于向文件中输入和输出字节。
(2)FileInputStream 和 FileOutputStream的常用构造方法:
FileInputStream(String name) throws FileNotFoundException
FileInputStream(File file) throws FileNotFoundException
FileOutputStream(String name) throws FileNotFoundException
FileOutputStream(File file) throws FileNotFoundException
FileOutputStream(File file,boolean append) throws FileNotFoundException
6.缓冲流
(1)缓冲流要“套接”在相应得节点流之上,对读写得数据提供了缓冲得功能,提高了读写得效率。同时增加了一些心得方法。
(2)J2SDK提供了四种缓冲流:
(a)缓冲输入流支持其父类得mark和reset方法。
(b)BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔)。
(c)BufferedWriter提供了newLine用于写入一个行分隔符。
(d)对于输出得缓冲流,写出得数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。
7.数据流
(1)DataInputStream和DataOutputStream分别继承自Inputsteam和outputStream,它属于处理流,需要分别“套接”在InputStream和Outputstream类型得节点流上。
(2)DataInputStream和DataOutputStream提供了可以存取与机器无关得Java原始类型数据(如:int,double等)得方法。
(3)DataInputStream和DataOutputStream的构造方法为:
(a)DataInputStream(InputStream in)
(b)DataOutputStream(OutputStream out)
8.转换流
(1)InputStreamReader和OutputStreamWriter用与字节数据到字符数据之间得转换。
(2)InputStreamReader需要和InputStream"套接"。
(3)OutputStreamWriter需要和OutputStream"套接"。
(4)转换流在构造时可以指定其编码集合,例如:
InputStream isr = new InputStreamReader(System.in,“ISO8859_1”)
9.Print流
(1)Printwriter和PrintStream都属于输出流,分别针对于字符和字节。
(2)PrintWriter和PrintStream提供了重载的print.
(3)Println方法用于多种数据类型的输出。
(4)PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。
(5)PrintWriter和PrintStream有自动flush功能。
10.Object流
(1)直接将Object写入或读出
(2)transient关键字(透明的)
(3)serializable接口
(4)externalizable接口