黑马程序员技术交流社区

标题: 云青年之JAVA中IO流的概述 [打印本页]

作者: 蚂蚁搬家    时间: 2013-6-1 17:27
标题: 云青年之JAVA中IO流的概述
首先是四大基本抽象流:字节流:InputStream、OutputStream,字符流:Reader、Writer;输入流:InputStream、Reader,输出流:
OutputStream、Writer;后面的所有流都是这四个的子类;

文件流:FileInputStream、FileOutputStream,FileReader、FileWriter,文件流算是四大基本抽象流的最初级实现类,前面两个是字节
流,可以用于任何格式文件的读写(因为文件的最基本存储形式就是字节数据),后面两个是字符流,只能用来处理文本文件;

缓冲流:字节流:BufferedInputStream、BufferedOutputStream,字符流:BufferedReader、BufferedWriter,这四个流用的是装饰设计
模式,在使用时要接收其它的流对象,比如文件流;同文件流一样,前面两个流可用于任何类型的文件读写,后面两个流主要用于文本文件
的读写,由于这四个流在建立对象后内部会自建缓冲区,所以读写的效率比较高,尤其是BufferedReader中的readLine()方法读取文本文
件特别合适,可以整行整行的读取,遇到换行符算是一行的结束,但是它不会返回换行符,所以需要在调用write()方法后用newLine()
方法新建换行符;

数据流:DataInputStream、DataOutputStream:用于基本类型数据的读写,采用装饰设计模式,构造方法的形参是流对象;

标准输入输出流:java.lang.System下的两个流,public static final InputStream in:标准输入流,此流已打开并准备提供输入数据。
通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。public static final PrintStream out:标准输出流,此流已打
开并准备接受输出数据。通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。

转换流:输入流InputStreamReader,将读取的字节数据转换为字符数据,输出流:OutputStreamWriter,将字符转换为字节输出,这两个
流都采用装饰设计模式,构造方法的形参是流对象,都可以指定转码时的编码表或者使用平台默认的码表;

从键盘录入:BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
输出到控制台:法一:BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
法二:PrintWriter pw = new PrintWriter(System.out, true);(PrintWriter流属于Print流,加上true参数,表示自动刷新缓冲区,无需调用flush方法,
而且这个流中的println方法会自动添加换行符,无需再调用newLine方法)

File类:将用户传递过来的文件名或者文件的路径封装为类对象,然后在对其进行读写前进行一系列的判断:比如exists(),判断文件或
路径是否存在,isFile(),判断是不是文件,isDirectory(),判断是不是目录,如果结果为false,直接让程序return,这样做岂不是更
安全!

Print流:PrintStream和PrintWriter,都用于写出,前者构造方法接收的参数类型为String文件名、File对象、OutputStream对象,后者
构造方法接收的参数类型为String文件名、File对象、OutputStream对象以及Writer对象,由于后者接收的参数类型范围广,所以其使用的
频率更高。
public PrintWriter(Writer out, boolean autoFlush):若autoFlush的值为true,则每次输出一行后会自动刷新,无需调用flush方法,
否则等遇到输入结束标志,才会在关闭流的时候刷新,但此法仅限于使用println、printf或者format三个方法时有效;
public PrintStream(OutputStream out, boolean autoFlush):功能类似于PrintWriter,但只有使用println方法或者遇到换行符时就会
刷新;

其它流:ByteArrayInputStream:构造函数接收字节数组,也即数据源就是字节数组;
ByteArrayOutputStream:构造函数不需要数据目的地,因为在该流内部已经封装了一个字节数组作为目的地,它会随着写入数据的增多而
自动增长,可使用 toByteArray() 和 toString() 获取数据;
这两个流因为并没有调用底层系统资源,所以close方法无效,类中的方法在关闭此流后仍可被调用,它们也不会抛出IOException;

流操作中的数据源和目的地:
数据源:
键盘(System.in)、硬盘(FileInputStream(文件))、内存(ByteArrayInputStream);
数据目的地:
控制台(System.out)、硬盘(FileOutputStream(文件))、内存(ByteArrayOutputStream);
在学习了TCP和UDP后会发现源和目的地又多了一对,即网络;

这众多的流中,除了最早出场的文件流外,其它的都是装饰设计模式,构造方法接收的形参都是流对象;

作者: 朱晓杰    时间: 2013-6-1 17:31
抢个沙发~~~支持下,加油!
作者: 蚂蚁搬家    时间: 2013-6-1 17:33
朱晓杰 发表于 2013-6-1 17:31
抢个沙发~~~支持下,加油!

哥们儿,你前段时间死命的发总结帖,很受教啊,现在咋不整了,很期待啊!万众期待!!!
作者: 袁梦希    时间: 2013-6-1 17:39
  呵呵   整理的很好   头像也很独特
作者: 朱晓杰    时间: 2013-6-1 17:49
蚂蚁搬家 发表于 2013-6-1 17:33
哥们儿,你前段时间死命的发总结帖,很受教啊,现在咋不整了,很期待啊!万众期待!!! ...

哪有,论坛里面呢么多牛人,版主呢个活动very good,就是学习进度赶不上版主的速度啊!所以也只能写写博客了
作者: 尹丽峰    时间: 2013-6-1 18:18
袁梦希 发表于 2013-6-1 17:39
呵呵   整理的很好   头像也很独特

:lol最近没时间上网。。哎。:lol




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2