----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
I O流(一)
(一)简介:
(1)特点:
1,IO流用来处理设备之间的数据传输
2,Java对数据的操作是通过流的方式
3,Java用于操作流的对象都在IO包中
4,流按操作数据分为两种:字节流与字符流(字节流+编码表)
5,流按流向分为:输入流(读)、输出流(写)
(2)字符流--FileWriter
字节流的两个顶层父类
1,InputStream 2,OutputStream
字符流的两个顶层父类
1,Reader 2,Writer
(3)注意:当我们向一个文件写入数据时(该数据存储的位置是临时存储区),所以记得要进行刷新,即对象.flush();但是,当我们使用对象调用close方法的时候,此时关闭了流,要了解的是它在进行关闭的流的操作的之前,就进行刷新了缓冲中的数据到目的地。
(二)高效读、写
1,字符流-缓冲区-BuffferWriter:
要想做到高效,最好的办法就是使用字符流的缓冲区,将写入的数据都存储到内存中,然后再一次性存入到指定的地点,这样就避免了单个的来回取,提高了写入的效率。
// 创建一个文本文件,如果有就不需要创建了
FileWriterfw=new FileWriter("Demo.txt");
// 创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联
BufferedWriterbufw=new BufferedWriter(fw);
// 使用缓冲区的写入方法将数据先写到缓冲区中
bufw.write("astring");
bufw.newLine();//换行,实际上就是将LINE_SEPARATORQ封装(但是只在BufferedWriter中具备)
bufw.write("anew string");
bufw.close();//关闭缓冲区(其实,底层关闭的就是fw)
2,字符流-缓冲区-BuffferReader:
FileReader fr=new FileReader("buf.txt");
BufferedReaderbufr=new BufferedReader(fr);//缓冲区一定要有被缓冲的对象
// Stringline=bufr.readLine();//只读一行(按照回车符确定)
// System.out.println(line);
Stringline=null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
注意:readLine()原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。
3,装饰设计模式:
对一组对象的功能进行增强时,就可以使用该模式进行问题的解决。其实,我们可以这么理解,就是把一个事物进行外观的改变,但是实体没有改变。如:将一个房屋进行装修,得到的就是装修后的结果了。
class Person{
void chiFan(){
System.out.println("吃饭");
}
}
class NewPerson{
private Person p;
NewPerson(Person p){
this.p=p;
}
void chiFan(){
System.out.println("开胃酒");
p.chiFan();
System.out.println("点心");
}
}
此时,NewPerson这个类的出现是为了增强Person类而出现的,实现了Person这个类的额外功能,并且,没有改变源程序。这就是我们在开发中经常使用到的一种模式。
注意:对于Person类的修改,我们也可以通过继承(当子父类中有相同的方法时,子类覆盖父类中的方法,并且你也可以继续使用父类的中的功能,利用super调用父类中的方法)搞定,现在就有一个问题:我们是使用继承还是装饰呢?装饰比继承更加灵活(可以使用也可以不使用),不需要让两个类之间产生关系的。
友情提示:比较装饰设计模式与继承之间的优缺点
4,读取键盘数据并打印在控制台上
分析:(1)将读取到的数据打印到控制台上,我们所能使用的就是尽量使用简单的高效率的去处理这个问题,自然就会想到的是缓冲区
(2)将缓冲区中的数据读取出来,放入控制台上
BufferedReaderbufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriterbufw=new BufferedWriter(new OutputStreamWriter(System.out));
Stringstr=null;
while((str=bufr.readLine())!=null){
if("over".equals(str)){
break;
}
bufw.write(str.toUpperCase());
bufw.newLine();
bufw.flush();
}
注意:
(1)在此程序中,自定义了终止程序方式,当输入的数据时over的时候,使用break终止该条数据,同时,我们也可使用return终止该循环,这两种方式都是可以的。
(2)使用缓冲区的时候,最好不要关闭流,因为当你关闭了流的时候,那么你下次想要输入数据就会报错的
(3)readLine()原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。
(4)newLine():换行,实际上就是将LINE_SEPARATORQ封装(但是只在BufferedWriter中具备)
(5)该数据最终是打印到了控制台上,我们也可以要求将该数据打印到指定的位置,如:我想打印到demo.txt这个文本目录下(因为写入的数据是字节,能和字节使用的,就是文件输出流),FileOutputStream();所以,我们只需要将System.out换成newFileOutputStream("demo.txt")
(三)总结:流的操作规律
1,明确源和目的(汇)
源:InputStream Reader
目的:OutputStream Writer
2,明确数据是否是纯文本数据
源:是纯文本:Reader
否:InputStream
目的:是纯文本:Writer
否:OutputStream
3,明确具体的设备
源设备:
硬盘:File
键盘:System.in
内存:数组
网络:Socket流
目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流
4,是否需要额外的功能:
(1)是否需要高效(缓冲区)
是:buffer
(2)转换(将字节流转换成字符流或者将字符流转换成字节流)
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------