文章目录
- IO简介
- 什么是IO
- 数据源
- 流的概念
- Java中四大IO抽象类
- Inputstream/OutputStream
- Reader/Writer
- java中流的概念详细解析
- 按流的方向分类
- 按处理的数据单元分类
- 按处理对象不同分类
- IO类的体系
- IO流入门
-
IO简介
什么是IO
- 对于任何程序设计语言而言,输入输出(lnput/output)系统都是非常核心的功能。程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件、数据库其他程序、网络、IO设备等等。外部系统比较复杂多变,那么我们有必要通过某种手段进行抽象、屏蔽外部的差异,从而实现更加便捷的编程。
- 输入(lnput)指的是:可以让程序从外部系统获得数据(核心含义是“读”,读取外部数据)。
- 常见的应用:
- 读取硬盘上的文件内容到程序。例如:播放器打开一个视频文件、word打开一个doc文件。
- 读取网络上某个位置内容到程序。例如:浏览器中输入网址后,打开该网址对应的网址的内容。
- 输出(Output)指的是:程序输出数据给外部系统从而可以操作外部系统(核心含义是“写”,将数据写出到外部系统)。
- 常见的应用有:将数据写到硬盘中。例如:我们编辑完一个word文档后,将内容写到硬盘上进行保存。
数据源
- ***数据源DataSource,提供数据的原始媒介。***常见的数据源有:数据库、文件、其他程序、内存、网络连接、IO设备。
- 数据源分为:源设备、目标设备。
- 源设备:为程序提供数据,一般对应输入流。
- 目标设备:程序数据的目的地,一般对应输出流。
程序和数据源的身份具有双重性。同一数据源可以同时是原设备和目标设备。程序的动作可以是读或写。
流的概念
- 流是一个抽象、动态的概念,是一连串连续动态的数据集合。
- 对于输入流而言,数据源就像水箱,流(Stream)就像水管中流动着的水流,程序就是最终的用户。通过流(AStream)将数据(Source)中的数据(information)输送到程序(Program)中。
- 对于输出流而言,目标数据源就是目的地(dest),我们通过流(AStream)将程序(Program)中的数据(information)输送到目的数据源(dest)中。
输入/输出流的划分是相对于程序而言的,而不是相对于数据源而言的。
Java中四大IO抽象类
- 流可以理解为就是流通数据的管道。java中流分为字节流和字符流。
- 字节流中提供了字节输入流和字节输出流。对应抽象类为Inputstream/OutputStream类。
- 字符流中提供了字符输入流和字符输入流。对应抽象类为Reader/Writer类。
- Inputstream/OutputStream和Reader/Writer类是所有IO流类的抽象父类。
Inputstream/OutputStream
- InputStream此抽象类是表示字节输入流的所有类的父类。
- *** Inputsteam是一个抽象类,它不可以实例化***。数据的读取需要由它的子类来实现。根据节点的不同,它派生了不同的节点流子类继承自Inputsteam的流都是用于向程序中输入数据,且数据的单位为字节(8bit)。
InputStream方法 | 说明 |
---|
int read() | ***读取一个字节的数据,并将字节的值作为int类型返回(0-255之间的一个值)。***如果未读出字节则返回-1(返回值为-1表示读取结束) |
void close() | 关闭输入流对象,释放相关系统资源。 |
- OutputStream抽象类是表示字节输出流的所有类的父类。输出流接收输出字节并将这些字节发送到某个目的地。
OutputStream方法 | 说明 |
---|
void write(int n) | 向目的地中写入一个字节。 |
void close() | 关闭输出流对象,释放相关系统资源。 |
Reader/Writer
方法名 | 说明 |
---|
Reader | Reader用于读取的字符流抽象类,数据单位为字符。 |
int read(): | ***读取一个字符的数据,并将字符的值作为int类型返回(0-65535之间的一个值,即Unicode值)。***如果未读出字符则返回-1(返回值为-1表示读取结束)。 |
void close(); | 关闭流对象,释放相关系统资源。 |
Writer | Writer用于输出的字符流抽象类,数据单位为字符 |
void write(int n) | 向输出流中写入一个字符 |
void close(); | 关闭输出流对象,释放相关系统资源 |
java中流的概念详细解析
按流的方向分类
- 输入流:数据流从数据源到程序(以Inputstream、Reader结尾的流)
- 输出流:数据流从程序到目的地(以OutPutStream、Writer结尾的流)
按处理的数据单元分类
- 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流。如FilelnputStream、FileOutputStream
- 字符流:以学符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流。如FileReader、FWriter
按处理对象不同分类
- 节点流:可以直接从数据源或目的地读写数据,如Filelnputstream、FileReader、DatalnputStream等。
- 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如Bufferedlnputstream、BufferedReader等。处理流也叫包装流。
- 节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。
IO类的体系
名称 | 用途说明 |
---|
1.Inputstream/Outputstream | 字节流的抽象类 |
2. Reader/Writer | 字符流的抽象类 |
3.FilelnputStream/FileOutputStream | 节点流:以字节为单位直接操作“文件” |
4.ByteArraylnputStream/ByteArrayOutputStream | 节点流:以字节为单位直接操作“字节数组对象” |
5.ObjectlnputStream/objectOutputstream | 处理流:以字节为单位直接操作“对象” |
6.Datalnputstream/DataOutputStream | 处理流:以字节为单位直接操作“基本数据类型与字符串类型” |
7.FileReader/FileWrite | 节点流:以字符为单位直接操作“文本文件”(注意:只能读写文本文件) |
8.BufferedReader/BufferedWriter | 处理流:将Reader/Writer对象进行包装,增加缓存功能,提高读写效率。 |
9.BufferedlnputStream/BufferedOutputStream | 处理流:将Inputstream/OutputStream对象进行包装,增加缓存功能,提高读写效率。 |
10.InputStreamReader/OutputStreamWriter | 处理流:将字节流对象转化成字符流对象 |
11.PrintStream | 处理流:将OutputStream进行包装,可以方便地输出字符,更加灵活。 |
IO流入门
第一个简单的IO流对象程序
- 当程序需要读取数据源的数据时,就会通过IO流对象开启一个通向数据源的流,通过这个流对象的相关方法可以顺序读取数据源中的数据。
演示一
package IO流;
import java.io.FileInputStream;
public class Demo01 {
public static void main(String[] args) {
FileInputStream fir=null;
try {
fir=new FileInputStream("C:\\demo.txt");
int s1=fir.read();
int s2=fir.read();
int s3=fir.read();
int s4=fir.read();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(fir!=null) {
try {
fir.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
演示二
package IO流;
import java.io.FileInputStream;
public class Demo02 {
public static void main(String[] args) {
FileInputStream fir=null;
try {
fir=new FileInputStream("C:\\demo.txt");
StringBuffer sb = new StringBuffer();
int temp=0;
while ((temp=fir.read())!=-1) {
System.out.println(temp);
sb.append((char)temp);
}
System.out.println(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}finally {
if(fir!=null) {
try {
fir.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}
}