一、流(Stream)
1.按方向分类
流按方向可分为输入流和输出流,对于内存(参照物)来说,输入流是输入计算机内存是二进制数据,输出流是从计算机内存输出的二进制数据。比如,键盘键入的数据就属于输入流,而内存数据持久化到磁盘中就属于输出流。
2.按大小(处理数据的单位)分类
流按大小可分为字节流和字符流,计算机中存储信息的基本单位是字节(Byte)。字符流只是通过不同的字符编码方式,对字节流的包装,即字符流的实现还是得依靠字节流。所以,信息传输归根结底是靠字节流实现的。
2.1字符流
字符流是包装后的字节流
2.1.1字符流的输出用PrintWriter类:
filename代表文件地址,out.println表示在该文件中输入图中文字,out.flush或out.close表示结束这个过程,类似于用完马桶后的冲马桶。结果如下:
在该文件中生成了文字。
在上一节的输出流中,我们学习了打印C/D盘中的所有文件:如下图
而要把C盘的文件全部打印到文件中时,用PrintWriter类实现:
但是Java不允许在属性抛去异常,alt+enter后是这样的:
这是静态代码块,因为属性写一大堆是不合适的(就像写作文的时候开头都是简单明了的),所以应该这么写。
下边scan方法中也改成:
运行后在文件地址打印出C盘所有文件:
2.1.2字符流的输入(Reader):
对Reader类:
它是一个抽象类,只能调用它的子类:
我们用FileReader类读取我们刚刚打印的C盘文件名:
打印结果是:
容易看出,这个程序一次只打印一个字符,要想打出全部的文件名,需要套循环,我们用while完成这件事,因为文件的末尾是-1,所以这样写:
打印结果:
但是这种程序有个缺点,它是一个一个读的,这里Java设计出了更好的类BufferedReader:
读取速度肉眼可见的提升了。
输入流的关系图:
3.对象流
存储对象的信息(例如excel表格中的数据)
对象流包括序列化(将Java对象转化成(也可视为拆成)二进制流)和反序列化(还原)
3.1存对象
做一个Student类用对象流输出和读取:
Student类要加上implements Serializable代表可序列化(可拆),如图:
对象流的输出的读取: