黑马程序员——20,IO流,FileWriter,FileReader

------<ahref="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

          

                    黑马程序员——20,IO流,FileWriter,FileReader

 

/*

IO流的介绍:

IO流式用来处理数据传输的,与IO流相关的类都定义在了java.io包里面

按照操作类型分:字节流和字符流,其中的字符流与文字编码表有关。

字节流的抽象基类:

           IntputStream,   OutputStream

字符流的抽象基类:

           Reader,          Writer

*/

import java.io.*;
class  Ioliou
{
         public  static void  main(String[] args)throws  IOException
                   //IO流代码后容易抛出异常,所以一般都会在方法上抛出IOException
         {
                   FileWriter  f=new  FileWriter("f:\\yyyyyyy.txt");
                   //FileWriter是用于操作文件的Writer类的子类对象
                   /*
                   这句话可以指定路径建立对应名字的文件,
                   如果指定路径中已经存在同名文件,那么原本文件会被新建文件覆盖掉。
                   */
                 
                   f.write("jkl"); //将字符串写入流中
                    /*
                    但是此时如果打开yyyyyyy.txt文件看的话发现里面并没有写入jkl
                    这是为什么呢?因为其写入的仅仅是流中,不是写入文件中
                   */
                    f.flush();//刷新流,把流里面的数据刷新到目的地
                    /*
                    此时再打开yyyyyyy.txt文件就会看见写入的jkl
                    */
                    f.close();//这句话作用是先刷新流,接着再关闭流
                    f.write("rty");//由于前面关闭了流,所以这句话是写不进流里面的
                    System.out.println("Hello World!");
         }
}

——————分割线——————

 

/*
IO流异常处理的方式
*/
 
import java.io.*;
class  Ioliou2
{
         public   static  void   main(String[] args)
         {
                   //涉及到IO流的语句一般都会抛出异常,所以try块里面才那么多语句
                  FileWriter  fi=null;
                   //为什么要在前面定义fi为空?
                   /*
                   因为后面的finally块里面有fi,
                   如果只是定义在try块里面,
                   fi的作用域只是在try块里面。
                   而后面还要调用fi.close();
                   所以,这个变量必须是全局变量。
                   至于初始化就放在try块里面。
                   */
                   try
                   {
                            fi=new   FileWriter("f:\\trtrtr.txt");
                       fi.write("123");
                       fi.flush();
 
                   }
                   catch(IOException  e)
                   {
                       soc(e.toString());
                   }
                   finally
                   {
                            try
                            {
                                     if(!(fi==null))
                                  fi.close();
                               /*
                               关闭资源的动作硬要执行,所以放在finally块里面,
                               又因为fi.close();也会抛出IO异常,
                               所以也用try...catch块处理.
                               为什么前面还要加一句判断是否为空?
                               因为有可能开始建立文件就失败了,
                               既然文件建立都失败了,那么还怎么关闭流呢?
                               所以要加一个判断语句。
 
                            */
                            }
 
                            catch(IOException  e)
                            {
                              soc(e.toString());
                            }
                                           
                   }
 
                  
         }
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);                          
         }
}

——————分割线————

 

/*
文件的续写:
*/
import java.io.*;
class  Ioliou3
{
         public  static  void   main(String[] args)
         {
             FileWriter  fi=null;
             try
             {
             fi=new  FileWriter("f:\\trtrtr.txt",true);
                   /*
             因为新建文件会覆盖原有文件,所以,FiletWriter类提供一个构造函数
             FileWriter(String  s,boolean  b)  表示可以在原有文件后面续写数据                     
                   */
             fi.write("我是\r\n英雄");
                   /*
             这句话表示输入数据“我是”然后换行接着输入数据“英雄”。
             为什么要在\n前面加上\r呢?
             因为\r\n写在一起在window系统里面才表示换行,
             仅仅是\n只是在java里面才表示换行。
             如果写的是fi.write("我是\n英雄");
             那么在java里面显示的确是会换行,但是用window系统里面的工具打开,
             “我是”与“英雄”之间会有一个黑块。这是window系统无法识别单独的\n的原因。
                   */                       
              }
             catch(IOException   e)
             {
               soc(e.toString());                                 
             }
             finally
             {
                try
                {
                     fi.close();      
                }
                catch(IOException  e)
                {
                  soc(e.toString());
                }
                         
                }
                  
              System.out.println("HelloWorld!");
             }
         public  static  void  soc(Object  obj)
         {
             System.out.println(obj);                              
         }
}

————————分割线——————

 

 

/*
数据的读取
*/
import java.io.*;
class  Ioliou4                  
{
         public   static  void  main(String[] args)
         {
                   FileReader   re=null;
                   try
                   {
                   re=new  FileReader("f:\\trtrtr.txt");
                   /*
                   建立一个文件读取流对象,并且指向已经存在的文件!
                   如果文件不存在,运行会发生FileNotFoundException
                   */
                   while(true)
                      {
                           
                        int i=re.read();
                             char ch=(char)i;
                        soc(ch);
                             if(i==-1)
                        break;  
 
                             int i2=re.read();
                             /*
                             read方法一次读取一个字符,返回的是int型数据,可以自动往下读取,
                             而且如果后面读到没有数据可读的时候就会返回-1,如果被强制转成字
                             符打印出来的是一个问号?
                        */
 
                        char ch2=(char)i2;
                        soc(ch2);
                             if(i2==-1)
                   break;
                       }
                   }
                   catch(IOException  e)
                   {
                            soc(e.toString());
                   }
                   finally
                   {
                            try
                            {
                                     re.close();//仅仅是关闭流      
                            }
                            catch(IOException  e)
                            {
                                     soc(e.toString());
                            }
                                 
                   }
 
         }
         public  static void  soc(Object  obj)
         {
                System.out.print(obj);                
         }
}

——————分割线——————

 

 

/*

第二种数据读取方式:调用read(char[]  ch)

                  

按照字符数组长度来读取,返回的是读取到的字符个数,

例如在本题中,长度为3的字符数组,读取的时候从第一位到第三位

填充字符,填充完了就返回填充的个数;再次调用read方法的时候,

会自动往下继续读取字符,又从第一位到第三位重新填充字符;

如果在某一次填充字符过程中,字符数组还没有填充完就没有字符继续填充的情况下,

这一次返回的是本次填充字符的个数,返回值也许不是字符数组长度,

如果在某一次填充字符过程中,字符数组还没有填充完就文件字符换行的情况下,

本次就只是填充到换行处,返回本次填充字符个数,下一次填充字符又从第一位开始填充下一行的字符。

再接下来,继续调用read方法读取,在上一次已经全部读取完字符了,那么这一次,返回值-1

读取一些比较大的文件的时候,一般定义字符数组长度1024

                  

*/


import java.io.*;
class  Ioliou5
{
         public   static  void   main(String[] args)
         {
           FileReader   fr=null;
                   try
                   {
                   fr=new FileReader("f:\\trtrtr.txt");
                   char[]  ch=new  char[5]; 
                   int     i  =0;
                   while((i=fr.read(ch))!=-1)
                   {
             soc(new String(ch,0,i));
                   /*
                 new  String(ch,0,i)表示新建一个字符串,
                   其内容为字符数组ch的从0位开始长度为i的字符组成。
             */    
                   }
                  
                   }
                   catch(IOException  e)
                   {
                        soc(e.toString());
                   }
                   finally
                   {
                            try
                            {
                                     fr.close();
                            }
                            catch(IOException   e)
                            {
                                     soc(e.toString());
                            }
                       
                             
                   }
 
         }
 
         public  static void  soc(Object  obj)
         {
             System.out.println(obj);                        
         }
}

——————分割线——————

 

/*
把文件从f盘复制到d盘
*/
 
import java.io.*;
class   Ioliou6
{
         public  static void  main(String[] args)
         {
                   FileWriter  fw=null;
                   FileReader  fr=null;
                   try
                   {
                   fw=new FileWriter("d:\\trtrtr_copy.txt"); 
                     //建立一个写入流对象,指定存储的路径的文件
                     fr=new FileReader("f:\\trtrtr.txt");
                     //建立一个读取流对象,与目的地相关联
                      char[]  ch=new  char[1024];
                      int i=   0;
                      while((i=fr.read(ch))!=-1)
                       {
                           fw.write(ch,0,i);
                                     /*
                                               按照字符数组ch从0位开始长度为i把字符写进流中
                           */
 
                       }                          
                   }
                   catch(IOException  e)
                   {
                      throw  new  RuntimeException("读写出问题了");
                             //抛出一个运行异常对象
                   }
                   finally
                   {
                            try
                            {
                                     if(fw!=null)
                               fw.close(); 
                            }
                            catch(IOException  e)
                            {
                       
                            }
                       try
                       {
                          if(fr!=null)
                           fr.close();
                       }
                       catch (IOException  e2)
                       {
                     
                       }
                           
                   }
 
                  
         }
         public  static void  soc(Object  obj)
         {
               System.out.println(obj);                    
         }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值