1、IO流的分类:
分为字节流,字符流,输入流,输出流

2、主要研究的问题:
如何新建一个流,并调用流里面的方法,以及每个流的特点:

3、java Io流这块有四大家族:
四大家族的首领是:所有的IO流对象都是这几个抽象类的子类;


4、java.io包下需要掌握的流有16个:

5、利用FileInputStream类读取第一txt文本(帮助了解实际使用中并不会这么用)(掌握)
注意:这里面的read函数,每次调用读取一个字节就返回,返回值是ascall码,当读取结束时,后面在返回的值都是-1,因此想要判断是否读取结束,那我们就要看返回的值是不是-1


6、一次性读取b.lenth个字节,这里的b是容器定义时的长度(帮助理解用的,不会使用这个程序)
5的例子里面的读取方式是读一个字节,就把这个字节放到磁盘中,这样运行的时间都浪费到传递的过程中了,如果我们把读取自己放到一个容器里,这时我们就可以读完很多字节再传一次,大大的提升了效率。


readCount=fis.read(bytes);这句话的意思是:调用fis的read函数,将读到的字节都放到定义好的bytes数组中,并返回这次读了几个字节。而System.out.println(new String(bytes,0,readCount))的意思是:将bytes中的自己从第一个值开始到readCount结束转换成字符串,并进行打印。

需要注意的几点是,这里的read函数返回的值是readCount,这个值是每次读取的字节数,本次函数调用一共读取了几个字节。当没读取到字节时,这个值返回的是-1,而不是0。还有就是前一次读取,没有将所有的字节都读完,第二次读取的时候,如果不够数组的长度,这时,就会出现前一次读取的字节还在数组里,新读的值会将原数组部分覆盖,也就是会出现这种形式

7、利用FileInputStream类读取txt文本文件最终版(需要掌握的)

这里fis=new FileInputStream(要读的文件地址,可以使从工程目录开始,应该是路径加文件名)。

8、FileInputStream类的其他常用方法:
int available():返会流当中剩余的没有读到的字节数量
long skip(long n):跳过几个字节不读。



9、利用:FileoutputStream新建并写入数据
这里的fos = newFileOutputStream("myfile")这句话会在工程的根目录下新建一个txt文件,并取名叫myfile并将这个流对象给fos
fos.write(bytes);将bytes中的字节全部写入流中,并在流中写入到myfile文件中,但是这种方法有个缺点就是,如果文件中本来有字节,这个write()方法会将原来的所有数据进行抹除。

10、利用在FileOutputStream(name,append);中的append参数来控制write()函数是否抹除原有文件中的数据。(注意这里的抹除是在new FileOutputStream()阶段进行的,而不是调用write()函数时进行的)这里面的fos.flush()是刷新数据流,这样就可以保证流中的数据都被写出到myfile中,而不是停留在流中。(这个是要掌握的)
如果append为true,那么就会接着文件的末尾写,而不是抹除原有的参数后再写。

11、文件的复制
关键的问题是一边读一边写,使用FileInputStream+FileOutputStream完成文件的拷贝
拷贝的过程是一边读一边写。
使用以上的字节流拷贝文件的时候,文件类型随意,万能的。什么文件都能拷贝。


注意这里的while循环里的循环体,就是这个程序的精髓,这里就是一边读一边写。

一边读一边写的内存图

13、字符流读取和写入字符:FileReader和FileWriteer(了解)
这两个抽象类都只能对普通的文本文件进行读和写,语法格式跟FileInputStream和FileOutputStream类似。

14、带有缓冲区的字符输入流(了解)
使用BufferedReader时,不需要定义char数组,也就是说不需要定义char数组,自带缓冲
注意这里new BufferedReader(reader);语句传的是一个FileReader()对象,
readline()函数是每次读取一行,注意这里只是读到换行的地方,但是并不会把换行符读入,当然也不会写出到txt中去,这样就会出现,如果不换行打印的话,就会一行一直打印下去。


15、转换流(包装流):InputStreamReader和OutputStreamReader两个抽象类(了解)
这两个类的作用是将字节流转换为字符流,这个类的构造方法的参数是传入一个字节流,输出一个字符流。
InputStreamReader用于对输入的FileInputStream字节流进行转换为字符流

OutputStreamWriter用于对输入的FileOutputStream字节流进行转换成字符流

16、数据专属流(了解)DataInputStream和DataOutputStream类
功能将数据和数据的类型一并写入文件当中,被写入的文件没有办法被记事本打开

按照什么顺序写进去就按照什么方式读出来。

17、标准字节输出流PrintStream:标准的字节输出流,默认 输出到控制台。



这里的System.setOut(printStream)是将数据流输出的方向改变,输出的方向在FileOutputStream对象定义的时候会定义。
18、利用PrintStream类和System.setOut(PrintSteam参数)的方式修改一个日志

