本文共 5093 字,大约阅读时间需要 16 分钟。
Java语言入门
Java流式输入/输出原理
输入/输出流的分类
Java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能
按数据流的方向不同可分为输入流和输出流; 按处理数据单位不同可分为字节流和字符流; 按功能不同可分为节点流和处理流。字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
J2SDK所提供的的所有流类型位于包java.io内都分别继承自以上四种抽象流类型
节点流和处理流
1 节点流可以从一个特定的数据源(节点)读写数据(如文件,内存)
2 处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。InputStream
1 继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit)
2 下图中圆形为节点流,菱形为处理流3 InputStream的基本方法
(1)int read() throws IOException 读取一个字节并以整数的形式返回(0-255),若返回-1表示已到输入流的末尾 (2)int read(byte[] buffer) throws IOException 读取以系列字节并存储到一个数组buffer,返回实际读取的字节数,已到末尾返回-1 (3)int read(byte[] buffer,int offset,int length)throws IOException 读取length个字节,并存储到一个字节数组,从offset位置开始,返回实际读取的字节数,已到末尾返回-1 (4)void close() throws IOException 关闭流,释放内存资源 (5)long skip(long n) throws IOExcption 跳过n个字节不读,返回实际跳过的字节数OutputStream
1 继承自OutputStream的流都是用于程序中输入数据,且数据的单位为字节(8bit)
2 下图中圆形为节点流,菱形为处理流3 OutputStream的基本方法
(1)void write(int b) throws IOException 向输入流中写入一个字节数据,该字节数据为参数b的低8位 (2)void write(byte[] b) throws IOEception 将一个字节类型的数组中的数据写入输出流 (3)void write(byte[] b,int off,int len) throws IOException 将一个字节类型的数组中的从指定位置off开始的len个字节写入到输出流 (4)void close() throws IOException 关闭流,释放内存资源 (5)void flush() throws IOException 将输出流中缓冲的数据全部写出到目的地Reader
1 继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)
2 下图中圆形为节点流,菱形为处理流3 Reader的基本方法
(1)int read() throws IOException 读取一个字符并以整数的形式返回(0-255),若返回-1表示已到输入流的末尾 (2)int read(char[] cbuf) throws IOException 读取一系列字符并存储到一个数组cbuf,返回实际读取的字符数,已到末尾就返回-1 (3)int read(char[] cbuf,int offset,int length) throws IOException 读取length个字符,并存储到一个数组cbuf,从offset位置开始,返回实际读取的字符数,已到末尾就返回-1 (4)void close() throws IOException 关闭流,释放存储资源 (5)long skip(long n) throws IOException 跳过n个字符不读,返回实际跳过的字符数Writer
1 继承自Writer的流都是用于程序中输入数据,且数据的单位为字符(16bit)
2 下图中圆形为节点流,菱形为处理流3 Writer的基本方法
(1)void write(int c) throws IOException 向输出流写入一个字符数据,该字节数据为参数b的低16位 (2)void write(char[] cbuf) throws IOException 将一个字符类型的数组中的数据写入输出流 (3)void write(char[] cbuf,int offset,int length) throws IOException 将一个字符类型的数组中的从指定位置offset开始的length个字符写入到输出流 (4)void write(String string) throws IOException 将一个字符串中的字符写入到输出流 (5)void write(String string,int offset,int length) throws IOException 将一个字符串从offset开始的length个字符写入到输出流 (6)void close() throws IOException 关闭流,释放内存资源 (7)void flush() throws IOException 将缓冲流中缓冲的数据全部写出到目的地FileInputStream与FileReader
1 InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
2 FileInputStream 类以二进制输入 / 输出, I/O 速度快且效率搞,但是它的 read ()方法读到的是一个字节,很不利于人们阅读。 而 FileReader 类弥补了这个缺陷,可以以文本格式输入/ 输出。 3 FileInputStream 以二进制方式处理,不会出现乱码现象 . 如果处理纯文本文件,建议使用 FileReader ,因为更方便,也更适合阅读;但是要注意编码问题!其他情况(处理非纯文本文件),FileInputStream是唯一的选择。节点流类型
类型 | 字符流 | 字节流 |
---|---|---|
File(文件) | FileReader,FileWriter | FileInputStream,FileOutputStream |
Memory Array | CharArrayReader,CharArrayWriter | ByteArrayInputStream,ByteArrayOutStream |
Memory String | StringReader,StringWriter | |
Pipe(管道) | PipedReader,PipedWriter | PipedInputStream,PipedOutputStream |
处理流类型
类型 | 字符流 | 字节流 |
---|---|---|
Buffering | BufferedReader,BufferedWriter | BufferedInputStream,BufferedOutputstream |
Filtering | FilterReader,Filterwriter | FilterInputStream,FilterOutputStream |
Converting between bytes and character | InputStreamReader,OutputStreamWriter | |
Object Serialization | ObjectInputStream,ObjectOutputStream | |
Data conversion | DataInputStream,DataOutputStream | |
Counting | LineNumberReader | LineNumberInputStream |
Peeking ahead | PushbackReader | PushbackInputStream |
Printing | PrintWriter | PrintStream |
缓冲流
1 缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率。同时增加了一些新的方法。J2SDk提供了四种缓冲流,其常用的构造方法为:
(1)BufferedReader(Reader in) (2)BufferedReader(Reader in,int sz) (3)BufferedWriter(Writer out) (4)BufferedWriter(Writer out,int sz) (5)BufferedInputStream(InputStream in) (6)BufferedInputStream(InputStream in,int size) (7)BufferedOutputStream(OutputStream out) (8)BufferedOutputStream(OutputStream out,int size) 2 缓冲输入流支持其父类的mark和reset方法 3 BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分隔) 4 BufferedWriter提供了newLine用于写入一个行分隔符 5 对于输出的缓冲流,写出的数据都会先在内存中缓冲,使用flush方法将会使内存中的数据立刻写出转换流
1 InputStreamReader和OutputStreamWriter用与字节数据到字符数据之间的转换
2 InputStreamReader需要和InputStream“套接” 3 OutputStreamWriter需要和OutputStream“套接” 4 转换流在构造时可以指定其编码集合,例如InputStream isr=new InputStreamReader(System.in , “ISO8859_1”)数据流
1 DataInputStream和DataOutputStream 分别继承自InputStream和OutputStream,它属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上
2 DataInputStream和DataOutputStream提供了可以存取与机器无关的Java原始类型数据(如int,double等)的方法 3 DataInputStream和DataOutputStream的构造方法为: 4 DataInputStream(InputStream in) 5 DataOutPutStream(OutputStream out)Print流
1 PrintWriter和PrintStream都属于输出流,分别针对字符和字节。
2 PrintWriter和PrintStream提供了重载的print。 3 Println方法用于多种数据类型的输出 4 PrintWriter和PrintStream的输出操作不好抛出异常,用户通过检测错误状态获取错误信息 5 PrintWriter和PrintStream有自动flush功能 6 PrintWriter(Writer out) 7 PrintWriter(Writer out,boolean autoFlush) 8 PrintWriter(OutputStream out) 9PrintWriter(OutputStream out,boolean autoFlush) 10 PrintStream(OutputStream out) 11 PrintStream(OutputStream out,booleanautoFlush) 12 PrintWriter和PrintStream都属于输出流,分别针对字符和字节。 13 PrintWriter和PrintStream提供了重载的print。Object流
1 直接将Object写入或读出
2 transient关键字 3 serializable接口 4 externalizable接口转载地址:https://blog.csdn.net/weixin_45854582/article/details/106226004 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!