流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。IO流的分类:根据处理数据类型的不同分为:字符流和字节流;根据数据流向不同分为:输入流和输出流。
理解Java的IO流,首答先要把视角放在内存上,而不是放在文件上。
InputStream是用来写入的没错,但不是写入文件中,而是写入内存中。所以InputStream的作用是从文件中读取数据然后写入内存中或者说写入到正在运行的程序中。
而OutputStream同理,是从内存/程序中将数据推送出去,把数据保存到文件中。
以Java程序作为主视角,你就能懂了。Input读取是为了读给程序用,Output写出是程序把数据输出到硬盘上了。
I/O为input(输入)/ output(输出)的简称,在Java中input和output代表将数据从其他地方写入程序例如从文件中读取文件,将文件内容保存在程序内存中,output代表程序将数据输出到某些地方,例如利用程序向文件中保存内容等,在Linux系统中,有一切皆文件的概念,不管对于任何文件,设备,网络设备等,在Linux下都被当做文件来进行处理;
在Java中IO操作是很重要的一块内容,从数据的传输方式来区分的话,可以分为字符流和字节流;这两者的主要区别在于数据流当中数据的最小单元,字节流代表读取数据的最小单位是字节,读取的时候可以一个字节一个字节的获取内容;字符流代表的是读取内容的时候是按照一个字符一个字符的读取;一个字符根据编码格式的不同,可能会包含多个字节,比如我们通常使用的utf-8的编码格式,在程序读取处理数据的时候,会根据编码格式从指定的编码表中获取到数据的字节数,然后再去获取指定字节大小的数据;在一般我们处理数据的时候,如果是处理文本类数据,可以优先考虑使用字符流,如果处理其他类型的数据,比如图像,视频等使用字节流进行处理;
从java源码中我们可以看到字节流的处理是以InputStream和OutputStream两个为基类,派生出很多的子类进行数据的处理,字符流的处理是以Reader和Writer两个为基类,派生出其他的子类进行数据处理;
在IO操作中,根据数据的传输方向,可以区分为输入流与输出流,其中输入输出方向的参考物是以程序为标准,将数据从数据源(比如文件,网络)中读取到程序中表示输入流;程序将数据输出到其他地方(比如文件,网络)中表示输出流;输入输出都是以程序来进行参考;
在java中我们可以根据类的命名区分出处理的是输入流还是输出流:InputStream和Reader及其子类代表的输入流的操作,OutputStream和Writer及其子类代表的是输出流的操作;
在java中除了这些操作上述的基本类之外,java还提供了处理文件的类File,使用File类创建的对象,可以进行文件或者文件夹的创建,删除,重命名等操作。在File对象中,包含了文件的基本属性,比如文件名,文件路径,文件大小,修改时间等。