上季内容回顾:
File类
RandomAccessFile类
---> 文件读、写操作
本季主要知识点:
1、字节流:InputStream、OutputStream
2、字符流:Reader、Writer
字节流和字符流
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_OutputStream
InputStream和OutputStream
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_OutputStream_02
为什么现在非要用子类去实例化InputStream和OutputStream呢?
查JDK文档
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_03
先完成向文件中写入数据:
OutputStream定义:
public abstract class OutputStream
extends Object
implements Closeable, Flushable
OutputStream是一个抽象类,如果是抽象类,则肯定要用其子类进行对象的实例化。
如果要向文件中保存,则要使用FileOutputStream。
就用这两个类完成向文件中写入一个字符串的目的。
FileOutputStream构造方法:
· public FileOutputStream(File file) throws FileNotFoundException:以File类的对象创建文件输出流
· public FileOutputStream(File file,boolean append) throws FileNotFoundException:以File类的对象创建文件输出流,在最后的append参数表示的是是否在文件后面追加内容,默认是追加的。
· public FileOutputStream(String name) throws FileNotFoundException:直接写入文件的路径,进行输出操作,实际上里面就自动包含了一个File类的对象,自动进行实例化
· public FileOutputStream(String name, boolean append) throws FileNotFoundException
向输出流中写入内容:
public void write(byte[] b) throws IOException
现在要写入的内容是一个字符串,但是write方法接收的只能是一个byte数组,必须把字符串变为字符数组才可以。
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_OutputStream_04
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_零基础学JAVA_05
以上的程序为字节的输出流,因为最终结果都是把字符串变为了byte数组了。
追加的时候就直接在后面写上一个控制的标记,内容为true:out = new FileOutputStream(f,true) ;
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_06
看下效果:
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_07
现在我们灵活点哈~由外部输入
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_08
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_09
能否通过程序把在文件中的内容读进来呢?
InputStream --> 字节肯定是byte数组
文件中的内容都是字节
InputStream中的方法:
把byte数组变为字符串就直接找String的构造方法。
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_10
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_IO操作_11
看下效果:因开辟byte[1024]空间,当读完文件中内容后剩余空间读不到数据就报错输出"?"符号。
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_IO操作_12 
下面解决读取报错问题哈~
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_零基础学JAVA_13
看下效果,现在出错的问号没有了,都换成空格了哈~
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_IO操作_14
下面我们想办法将空格去掉哈~定义一个计数,计算到底一共读了多少位
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_15
看下效果:
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_16
如果直接使用InputStream类中的read()方法读取,则必须一个一个读,当文件读到底(read的返回值为-1时就表示文件读到底),则退出循环,之后用String把byte数组变为字符串输出。
使用另外一个read方法,传入一个byte数组,之后由类自动把内容赋给byte数组。
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_17
看下修改后的效果是否一样哈~
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_18
在字节流的操作中,可以发现一切都必须以byte数组为标准。
字符流:直接支持字符的操作
Reader、Writer
使用Writer向文件中写入内容:
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_19
看下效果有没写入数据哈~
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_20
与之前的OutputStream在使用上是非常相似的,只是现在可以直接操作字符串了。
Reader的使用:
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_21
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_IO操作_22
关于OutputStream与Writer及InputStream与Reader到底有那些区别呢?
· 字节流是没有使用到缓冲区的,是直接操作文件的
· 字符流是使用到了缓冲区,所有的内容要先放在缓冲区中,之后才能向文件中写入。
OutputStream
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_OutputStream_23
看下效果:文件流最后没有关闭,内容也依然可以输出
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_JAVA_24
现在把程序换成字符流,又会如何?
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_零基础学JAVA_25
发现如果不关闭,则内容是无法输出的,因为内容全部都在缓冲区中,之前是因为调用了close()方法,所以会自动把缓冲区给清空掉。
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_零基础学JAVA_26
可以直接使用强制性的把缓冲内容输出的操作完成。
public abstract void flush() throws IOException
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_IO操作_27
看下效果:
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_InputStream_28
证明字节流不使用缓冲区,字符流使用到缓冲区~~~
总结
练习题(下季讲解哈~~~)
[零基础学JAVA]Java SE应用部分-28.Java IO操作(02)_OutputStream_29
掌握四个类的基本操作:
InputStream、OutputStream、Reader、Writer,分别的四个文件的操作子类:FileXxx之类。
############################################