黑马程序员IO流Part1

本文深入探讨了Java IO流的基本概念、分类、操作流程,包括字节流与字符流的区别,着重介绍了FileWriter与FileReader类的使用方法、文件的读写与续写过程,以及文件拷贝的实现步骤。同时,阐述了缓冲区的作用及其在流操作中的应用,最后通过装饰设计模式解释了如何对现有对象进行功能增强。

------- android培训java培训、期待与您交流! ----------

 

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

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

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

流按操作数据分为两种:

字节流和字符流;

流按流向分为:输入流,输出流。

字节流的抽象基类:InputStream,OutputStream

字符流的抽象基类:Reader,Writer;

流操作的基本规律:

1、明确源和目的;

2、操作的数据是否为纯为本;

3、当体系明确后,在明确要使用哪个具体的对象。

FileWriter,FileReader类:

操作流程:

1、创建相应的流对象,该对象被初始化时必须要明确被操作的文件。而且该文件会被创建到指定

目录下。如果该目录下已有同名文件,将被覆盖(调用第一个构造函数)。 

2、进行相应的读写操作;

3、是否需要进行刷新操作,如果需要,则需要进行刷新;

4、关闭流,释放资源。

FileWriter:

  

 class  FileWriterDemo {  
      public static void main(String[] args) throws IOException {         
          /*创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。*/  
          FileWriter fw = new FileWriter("demo.txt");  
          //调用write方法,将字符串写入到流中。  
          fw.write("abcde");  
          /*刷新流对象中的缓冲中的数据。 
          将数据刷到目的地中。*/  
          //fw.flush();  
   
   
         /*关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。 
              将数据刷到目的地中。 
              和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。  */  
				  fw.close();  
    }  
 }  


 

 

文件的续写:通过构造方法创建可续写文件的流对象。


  public static void main(String[] args) throws Exception {  
    
   FileWriter fw = new FileWriter("demo.text",true);//续写,不覆盖已有的文件  
   fw.write("abc");             
   fw.close();  
  } 


  

文件拷贝代码片段:

       通过FileReader读取指定文件中的内容,创建一个1M大小字符数组缓冲区,再由FileWriter流对象写入指定的目标文件。

   public static void copy_2() throws Exception {  
            
          FileReader fr = new FileReader("D:\\testsrc.txt");//创建FileReader对象指向要读取的文件  
            
          FileWriter fw = new FileWriter("D:\\dest.txt");//创建FileWriter对象指向要写入的目的文件  
            
          int len = 0;  
          char[] buf = new char[1024];//创建一个缓冲区  
            
          while((len=fr.read(buf)) != -1) { //读取文件内容  
             fw.write(buf,0,len);//写入文件内容  
         }  
             
         fr.close();  
         fw.close();  
     }


字符流的缓冲区:

    缓冲区的出现提高了对数据的读写的效率;

对应类:BufferedWrite, BufferedReader;

缓冲区要结合流才可以使用。

    在流的基础上对流的功能进行了增强。

BufferedWrite提供了一个跨平台的换行方法,newLine();

BufferedReader提供了一个读一行的方法,readLine()不包含行终止符。当返回null是,表示已经读到了文件的末尾。

因为在BufferedReader和BufferedWrite中调用了相应的流对象,所以只需要关闭BufferedReader和BufferedWrite,释放资源。

 

装饰设计模式:

当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。继承和装饰的区别:

装饰模式比继承更灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。

装饰类因为增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强的功能,所以装饰类和被装饰类通常属于同一个体系中。


read 方法返回的为什么是int类型,而不是byte类型:

  为了防止凑巧读取到8个1(十进制的-1),这样正好符合了判断条件,而此时文件并没有读取结束,所以将byte类型提升为int类型,由4个字节来存放数据,前3个字节补0(方法是将提升后的数据与255进行与运算),避免了出现-1的情况,也保证了原数据没有变化。而write方法在执行时,又将4个字节的int类型转换为了1个字节的byte类型。

 

 

 

------- android培训java培训、期待与您交流! ----------

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值