黑马程序员--IO流

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

 

一,字符流的缓冲区:提高对数据的读写效率

      1.对应的类:BufferedReader、BulideredWriter,使用缓冲区之前,必须先有流对象

      2.使用步骤:先创建流对象,再创建对应缓冲区,写入或读取内容,关闭缓冲区

       写:①FileWriter fw = new FileWriter("buf.txt"); //指定路径文件如不存在会自动创建,若存在会覆盖该文件                 

             BufferedWriter bufw = new BufferedWriter(fw);

             bufw.write("abcdef");           //

                bufw.newLine();//跨平台的换行方法

                bufw.flush();//写一次,刷新一次 

             bufw.close();//关闭缓冲区其实就是关闭流对象了

       读:FileReader fr = new FileReader("mudi.txt");//指定文件必须存在

             BufferedReader bufr = new BufferedReader(fr);

             String line = null;

                while((line=bufr.readLine())!=null){

                          System.out.println(line);

                }

             bufr.close();

 

     3.复制文本文件

             BufferedReader bufr = null ;

             BufferedWriter bufw = null ;

     try:bufr = new BufferedReader(new FileReader("buf.txt"));

             bufw = new BufferedWriter(new FileWriter("copy.txt"));

             String line =null;

             while((line=bufr.readLine())!=null){

                    bufw.write(line);

                    bufw.newLine();

                    bufw.flush();

             }

  catch:IOException

 finally:

             try{

                  if(bufr!=null){

                      bufr.close();

                  }

             }catch(IOException e){ ....}

             try{

                  if(bufw!=null){

                      bufw.close();

                  }

             }catch(IOException e){ ....}

 

      4.装饰设计模式:自定义类,使用已有对象,基于已有功能,并提供加强功能,该类就称为装饰类

            ①装饰类通常通过构造函数接受被装饰对象,并基于被装饰对象,提供更强的功能

            ②装饰类和继承的区别:装饰模式比继承更灵活,避免了继承体系臃肿,而且还降低了类与类之间的联系

            ③自定义装饰类,继承Reader(实现Reader的抽象方法)

            ④带行号的装饰类:lineNumberReader类

    

     5.字节流的读写:InputStream、OutputStream,操作步骤和字符流基本相符

         用例:复制图片

             操作步骤:

                           FileOutputStream fos = null;

                           FileInputStream fis = null;

                  try: fos = new FileOutputStream(new FileOutputStream("a.jpg"));

                           fis = new FileInputStream(new FileInputStream("b.jpg"));

                           byte[] buf = new byte[1024];

                           int num= 0; 

                           while((num=fis.read(buf))!=-1){

                                   fos.write(new String(buf,0,num));

                           }

               catch:IOException e

            finally:   try{

                                      if(fis!=null){

                                             fis.close();

                                      }

                                } catch(IOException e){......}       

 

      6.字节流的缓冲区(mp3的复制)

                  BufferedInputStream bufis = null;

                  BufferedOutputStream bufos = null;

          try:bufis = new BufferedInputStream(new FileInputStream("a.mp3"));

                  bufos = new BufferedOutputStream(new FileOutputStream("b.mp3"));

                  int num =0;

                  while((num=bufis.read())!=-1){

                          bufos.write(num);

                  }

      catch:IOException e

    finally: try:bufis.close();

                          bufos.close();       

     

     7.自定义字符流缓冲区   

          read、write方法特点:read方法在提升,避免了-1,write方法在强转,保证源数据不变。         

     8.读取键盘录入

           System.out:对应的标准输出设备,控制台; System.in:对应的标准输入设备,键盘。

          BufferedWriter bufw = new BufferedWriter(new InputStreamReader(System.in));//源

           BufferedReader bufr = new BuferedReader(new OutputStreamWriter(System.out));//目的

     9.流操作的规律 

           ①首先明确源和目的:源可以代表输入流InputStream,Reader;目的:输出流,OutputStream,Writer.

           ②明确操作的数据是不是纯文本,如果是,使用字符流,否则用字节流

           ③源设备包括:内存,硬盘,键盘;目的设备包括:内存,硬盘,控制台

        小结:转换流使用场合:字符和字节流间的桥梁,涉及字符编码转换时。

     10.其他

          改变标准输出设备:System.setIn("输入流")、System.setOut("输出流").

          异常日志信息:比较适用的是log4j

          系统信息:Properties prop =  System.getPeoperties();

                            prop.list(new PrintStream("info.txt"));

 

  二,File类:将文件或文件夹封装成对象,便于操作文件或文件夹

      1.File概述 : File f = new File("指定目录");//创建File对象

             File对象的操作:

                   创建文件:boolean  f.createNewFile();//若文件存在,不覆盖,返回false

                   删除文件:boolean  f.delete();//如果有异常,可能会删除不成功

                   判断文件:boolean  f.exists();在判断isFile()是否是文件,idDirectory()是否是文件夹,isHidden()是否隐藏时,必须先判断文件是否存在

                  获取:getName(),getAbsolutePath(),lastModified()

     2.文件功能

              File[] fs = File.listRoots(); //返回文件系统根

              String[] names = f.list();  //指定文件或文件夹下的所有名称,包括隐藏文件,需要注意f 对象必须指定某个目录

              File[] s = f.listFiles(); //得到目录中的文件

     3.递归:函数自身调用自身,要注意的是①递归的限定条件 ②递归次数,避免内存溢出

               用例:删除带内容的目录(原理是从里往外删除内容)

     4.创建java文件列表

            原理是:自定义方法、集合,先用listFiles()获得一个目录,遍历该目录再判断,如果该目录存在(f.isDirectory())则用递归再调用该方法,否则将后缀名为".java"的文件添加到list集合中,遍历该集合,将内容写到磁盘中即可

     5.Properties类

          概述:它是HashTable的子类,存储的是键值对字符串,具备map集合的特点。   

          特点:可以用于键值对形式的配置文件,是集合中和IO技术相结合的集合容器。

             Properties prop = new Properties();

             prop.setProperty("张三","30");     //设置一个键值对,输出结果是:张三=30

             String  value= prop.getProperty("张三");    //获得值

             Set<String> names = prop.stringPropertyNames();    //获取所有key,返回一个Set泛型

         存储配置文件

                     原理:用BufferedReader流读取到源文件,将文件用Properties对象的setProperty(arr[0],arr[1])进行存储

   

     6.其他对象

          打印流:该流提供了打印输出方法,它可以保证数据原样性将数据打印出

          ①字节打印流:PrintStream

                它的构造函数可接受的类型有:File对象、字符串路径String、字节输出流OutputStream.

          ②字符打印流:PrintWriter(很常用,在web中通过它打印信息到客户端)

                它的构造函数可接受的类型有:File对象、字符串路径String、字节输出流OutputStream、字符输出流Writer.

                  BufferedReader bufr = new BufferedReader(new IputStream(System.in));//获取键盘录入

                  PrintWriter out = new PrintWriter(System.out,ture);//字符输出流,指定true自动刷新

                  String line = null;

                  while((line=bufr.readLine())!=null){

                         out.println(line);//使用PrintWriter流对象直接输出语句即可

                  }

                  bufr.close();

                  out.close();

        合并流(SequenceInputStream):多个流拼成一个流

         切割文件

 

  ,对象序列化(持久化):某一个介质能长期存储数据(硬盘)

     1.ObjectOutputStream:

            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));

            oos.write(new Person对象("张三",22));//Person类需实现序列化接口

            oos.close(); 

     2. 管道流:可以对接到一起的对象,结合线程使用。

            PipedInputStream pis = new PipedInputStream();

            PipedOutputStream pos = new PipedOutputStream();

            in.connect(out);//管道连接

            ....

     3.随机访问文件:不是IO体系中的类,直接继承了Object,但它是IO包中的成员,它具有读和写的功能

           RandomAccessFile:可以通过getFilePointer()获取指针,通过seek()改变指针位置.

               完成读写的原理:在其内部封装了字节输入流和输出流;特点:只能操作文件,可以以指定模式对文件进行读写

               RandomAccessFile  rsf = new RandomAccessFile("a.txt","rw");//4种模式:r(只读) rw(读写)  rws  rwd

               rsf.seek(8);//取指针   rsf.writeInt();

    4.操作基本数据类型流对象DateStream

          DateInputStream dis = new DateInputStream(new FileInputStream("utfdate.txt"));

          DateOutputStream dos = new DateOutputStream(new FileOutputStream("date.txt"));

          dos.writeInt(123); dos.writeBoolean(true);//怎么写

          int num = dis.readInt(); boolean b =dis.readBoolean();//就怎么读

   5.操作字节数组(ByteArrayStream):用于操作字节数组的流对象,不用关闭资源

          ByteArrayInputStream  bais = new ByteArrayInputStream("abcdef".getBytes());//需要数据源,即字节数组

          ByteArrayOutputStream  baos = new ByteArrayOutputStream();//可不指定目的

          int len = 0;

          while((len.bais.read())!=-1){

                baos.write(len);

          }

          syso(baos.size());

    6.字符编码:为了方便操作字符

              String str = "联通";

        编码:字符串变成字节数组,-->byte[] b = str.getByte();

        解码:字节数组变成字符串,-->new String(b);

        联通:byte[] by = str.getByte("gbk");

         

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

         

                 

                       

          

           

          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值