昆 明 外 围 - 昆 明 的 外 围 资 源 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次.
在这里要注意的是当我们关闭了缓冲区对象实际也关闭了与缓冲区关联的流对象。
BufferWriter类
try {
FileWriter fw =new FileWriter("test.txt");
//使用缓冲区必须要与一个流对象相关联
BufferedWriter bw =new BufferedWriter(fw);
bw.write("hello world!");
//使用缓冲区的时候要注意刷新
bw.flush();
//关闭缓冲区的对象,实际上是关闭与它关联的流对象最好放在finally执行
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
其实BufferReader也是差不多的,这里就不多讲
FileReader fr =new FileReader("test.txt");
BufferedReader br =new BufferedReader(fr);
String line =null;
//注意readLine方法读取的内容不包括换行符
while((line=br.readLine())!=null){
System.out.println(line);
}
readLine原理:
昆 明 外 围 - 昆 明 的 外 围 资 源 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,所以最终使用的还是read方法一次读一个的方法。
二、装饰模式
?
package i18n;
public class test {
}
class Person {
public void eat() {
System.out.println("吃饭");
}
}
public class PersonEnhance {
private Person p;
// 把需要增强 的类传进去初始化
public PersonEnhance(Person p) {
this.p = p;
}
public void enhanceEat() {
System.out.println("开胃酒");
p.eat();
System.out.println("甜点");
}
}
装饰模式作用:就是在原有类的基础上把某个方法增强功能
但是这让我想到了java 的动态代理,他也是在某个方法的基础上增加额外的功能,那么她们有什么区别呢?
装饰类和被装饰的类是应该继承或实现相同的接口,而java的动态代理不是,
还有一个不同点就是动态代理可以横切多个面,也就是同时对多个方法进行增强.
通过装饰模式和继承的区别发现了程序设计之美,虽然继承也可以增强某个方法,但是它使得类的体系很臃肿,并且可扩展性不好
因为装饰模式中,我们可以把被装饰类的父类当作参数传进装饰类的构造方法内,那么你这一个装饰类就可以应用于这个体系的了,这也是java多态性的好处.
相比较之下使用装饰模式降低了类之间的关系.
装饰类是因为增强了已有的对象,具有的功能和已有的是相同的,是不过提供了更强的功能,所以装饰类和被装饰类通常属于一个体系中的.
在API中可以看到BufferedReader类还有一个子类LineNumberReader
通过API对得知,这是一个字符缓冲输出流,该类保持对行号的跟踪,可以通过该类的setLineNumber(int) andgetLineNumber() 方法分别设置获取行号
例如程序:
?
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String num = null;
while ((num = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + num);
}<br>}
控制台输出:
但是我们也可以改变行号的开始值
?
11
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String num = null;
// 设置行号的开始值为100
lnr.setLineNumber(100);
while ((num = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + num);
}
}
输出结果为:
LineNumberReader
EnhanceLineNumberReader
?
19
20
public String readLine() throws IOException {
int lineNumber=0;
lineNumber++;
StringBuilder buffer =new StringBuilder();
int i = 0;
while ((i =reader.read()) != -1) {
if ((char) i ==‘\r‘) {
continue;
}
if ((char) i ==‘\n‘) {
return buffer.toString();
}else {
buffer.append((char) i);
}
}
if (buffer.length() != 0) {
return buffer.toString();
}
return null;
}
书出结果是一样的
下面开始学习字节流
通过API文档字节流的顶级类为InputStream和OutputStream
首先来看一下FileOutputStream和FileInputStream
?
1
2
3
4
public static void writeData()throws Exception{
OutputStream out =new FileOutputStream("D:\\test2.txt");
out.write("hello inputStream!".getBytes());
}
昆 明 外 围 - 昆 明 的 外 围 资 源 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !执行上面代码后,发现在D盘创建了test2.txt文件并且内容是hello inputStream!
从上面可以看出这和字符流是有区别的,因为当我们在使用字符流的时候,如果没有刷新并且没有关闭那么文件内容是空的,而这里刚好相反.
但是最好我们还是调用close方法,关闭资源.提高性能.
昆 明 外 围 - 昆 明 的 外 围 资 源
猜你喜欢
转载自www.cnblogs.com/zhaoyanchun/p/12784081.html
今日推荐
周排行