【学习日记】有关java的IO的知识点总结
2015-09-09 01:04
555 查看
最近在看毕向东老师的java基础视频的IO部分知识的讲解。由于IO这块知识很重要,而且小的知识点很多,方法也多,今晚做个简单的总结以便日后复习。
IO概述
字符流的方法
字节流的方法
装饰设计模式
缓冲区的介绍
IO概述
IO在java中是很重要的概念和知识点,按流向分为输入流和输出流,按操作数据分为**字节流**和**字符流**,顾名思义,字节流以字节为单位,字符流以字符为单位。java.io包中包含有关IO的各种类及其接口,其中InputStream和Reader是所有输入流的父类,OutputStream和Writer是所有输出流的父类。*InputStream*和*OutputStream*属于字节流,*Reader*和*Writer*属于字符流。
字符流的方法
字符流以字符为单位进行数据操作,操作文本文件很方便,避免了编码。
字符流的常用类
分类 | 输入流 | 输出流 |
---|---|---|
抽象基类 | Reader | Writer |
访问文件 | FileReader | FileWriter |
缓冲流 | BufferedReader | BufferedWriter |
FileWriter的构造方法 | |
---|---|
FileWriter(String s) | 创造文件,s:文件地址及文件名 |
FileWriter(String s,boolean t) | 续写文件,s:文件地址及文件名,t : true续写。false新建。 |
Writer的常用方法 | |
---|---|
close(); | 关闭此流,但要先刷新它 |
flush(); | 刷新该流的缓冲 |
write(int c / char[] cbuf / String arg / char[] cbuf, int off, int len) | 写入单个字符、写入字符数组、写入字符串、写入字符数组的一部分,也可写入字符串的一部分 |
Reader的常用方法 | |
---|---|
close(); | 关闭此流 |
read(void / char[] cbuf / char[] cbuf, int off, int len) | 读取单个字符、 将字符读入数组、将字符读入数组的某一部分 |
字节流的方法
字节流以字节为单位进行数据操作,可以处理各种文件,应用广泛。
字节流的常用类
分类 | 输入流 | 输出流 |
---|---|---|
抽象基类 | InputStream | OutputStream |
访问文件 | FileInputStream | FileOutputStream |
缓冲流 | BufferedInputStream | BufferedOutputStream |
FileOutputStream的常用方法 | |
---|---|
close() | 关闭此输出流并释放与此流有关的所有系统资源 |
flush() | 刷新此输出流,并强制将所有已缓冲的输出字节写入该流中 |
write(byte[] b / byte[] b, int off, int len / int b) | 将 b.length 个字节写入此输出流、将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流、将指定 byte 写入此输出流 |
available() | 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取(或跳过)的估计剩余字节数 |
close() | 关闭此输入流并释放与此流关联的所有系统资源 |
FileInputStream的常用方法 | |
---|---|
read(void / byte[] b / byte[] b, int off, int len) | 从此输入流中读取下一个数据字节、 从此输入流中将 byte.length 个字节的数据读入一个 byte 数组中、从此输入流中将 len 个字节的数据读入一个 byte 数组中 |
装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是都属于一个体系中的。
readLine原理即是利用装饰设计模式
该方法是使用FileReader的read方法。创建一个StringBuilder,然后不断的用read读取一个字符,并将其存入字符串缓存中,当读到\r时,不将\r存入,当读到\n时,表明该行结束,将字符串缓存返回其字符串。
代码如下:
class MyLine { private Reader r; MyLine(Reader r) { this.r = r; } public String myReadLine()throws IOException { StringBuilder sb = new StringBuilder(); int ch = 0; while((ch=r.read())!=-1) { if(ch=='\r') continue; if(ch=='\n') return sb.toString(); else sb.append((char)ch); } if(sb.length()!=0) return sb.toString(); return null; } public void myClose()throws IOException { r.close(); } }
缓冲区的介绍
字符流的缓冲类:BufferedReader和BufferedWriter字节流的缓冲类:BufferedInputStream和BufferedOutputStream
缓冲区是对IO的一种性能优化。BufferedReader类和BufferedWriter类对字符流Reader/Write进行缓冲区包装。
缓冲区的出现是为了提高流的操作效率而出现的。所以在创建缓冲区之前,必须要先有流对象。然后将创建好的流对象当作参数传递给缓冲的构造函数。
只要用到缓冲区,就要记得刷新。关闭缓冲区,就是在关闭缓冲区中的流对象。故不用单独在关闭流对象。
缓冲区的常用方法
newLine()(字符流特有) 写入一个行分隔符。
flush(); 刷新该流的缓存。
read();读取单个字符/字节/读入特定字符或字节。
readline();(字符流特有)读取一个文本行,返回为字符串。当返回null时,达到文件末尾。该方法返回的是回车符之间的数据,不包括回车符,所以需要回车符的话,加一个newLine()。
write();写入指定字节/字节数组(或某一部分)/单个字符/字符串(或某一部分)/字符数组(或某一部分)。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统