黑马程序员--I O流(一)

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

I O流(一)

(一)简介:

1)特点:

       1IO流用来处理设备之间的数据传输

       2Java对数据的操作是通过流的方式

       3Java用于操作流的对象都在IO包中

       4,流按操作数据分为两种:字节流与字符流(字节流+编码表)

       5,流按流向分为:输入流(读)、输出流(写)

2)字符流--FileWriter

字节流的两个顶层父类

               1InputStream  2OutputStream

字符流的两个顶层父类

               1Reader           2Writer

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)使用缓冲区的时候,最好不要关闭流,因为当你关闭了流的时候,那么你下次想要输入数据就会报错的

3readLine()原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。

4newLine():换行,实际上就是将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学习型技术博客、期待与您交流! ----------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值