Java语言入门(十一)——流
发布日期:2022-02-28 07:22:50 浏览次数:27 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java语言入门(九)——线程类及多线程
下一篇:Java语言入门(十二)——网络编程

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月30日 12时04分24秒