• 黑马程序员_<<IO流基本操作(Writer,Reader)>>


    --------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


    1.概述

    硬盘之间的文件的传输,硬盘中文件的操作,他们之间的操作都是需要流进行操作的,对数据的操作是通过流进行操作的。

    对流操作的类型进行分类:字节流和字符流

    按流的流向分为:输入流和输出流

     

     字符流是基本流,操作的二进制数据,可以对文本文件进行操作,要是操作图片,那么用字符流

     

    他们的基类:

         字节流类:InputStream 和OutputStream

    字符流:Reader和Writer

    2.  FileWriter

           此流是输入流,写入流,当文件中写入信息。

            1.基本操作

       

     import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
     
    public class WriterDemo {
        public static void main(String [] agrs) throws IOException{
        /*利用构造方法指定文件的地址 FileWriter(String fileName)
         * 1.当此时路径下已经存在此文件,那么就会覆盖此文件,
         *   如果不存在此文件,那么就会在当前路径下创建此文件
         * 2.如果你的路径写错了,就不当前硬盘下或者说电脑下,没有此应该或者是此目录,那么就是报异常
         *   例如:你电脑下不存在K盘,你写的路径是new FileWriter("K:\demo.txt")那么就会报异常
         *       例如你电脑上存在F盘,但是不存在dd文件夹,你写new FileWriter("F:\dd\demo.txt")也会报异常*/
        Writerwriter=new FileWriter("F:\demo.txt");
        /*当创建好文件后,想里面写数据,利用write()方法,有很多重载方法*/
        writer.write("hello");
        /*调用了方法write后,只是把数据写到了缓冲流中,必须使用flush()方法来刷新缓冲
         * 当你写完毕后,也可以调用close()方法,此方法会关闭流,在关闭之间就自动刷新了该缓冲,关闭后,就不能利用此流继续写了
         * 但是你使用flush()方法,还可以使用此流继续写,这也是close()和flush()的区别*/
        writer.flush();
        writer.close();
        }
    }

    结果:创建了指定的文件,也写入了写入的数据。

     

          2.异常处理格式

            

     import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
     
    public class WriterDemo {
      public static void main(String[] agrs) {
        /* 先声明流对象,实例的时候可能会报异常,那么就捕获 */
        FileWriter writer = null;
     
        try {
          writer = new FileWriter("F:\demo.txt");
          writer.write("hello");
          writer.flush();
        } catch (Exception e) {
          System.out.println(e.toString());
        } finally {
          /*
           * 在finally中关闭流,这样不管前面是否出现异常,此流必须关闭,加入流创建了,那么就关闭,加入没有创建就不需要关闭,
           * 所以要先判断一下
           */
     
          try {
             if (writer != null)
               writer.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
        }
      }
    }

          3.对已存在的文件进行续写

          

     import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
     
    public class WriterDemo {
      public static void main(String[] agrs) {
        /* 先声明流对象,实例的时候可能会报异常,那么就捕获 */
        FileWriter writer = null;
    /*对已有文件进行续写,在构造方法中有个执行是否是续写的参数,
     * FileWriter(String fileName,boolean append)
     * append是true写到尾部,当为false,表示重新写入
     * 
     * 
     *  在这说明一下换行,window的记事本上
    表示换行,如果只写
    不换行
     *  由于软件不同,换行的标志也不一样,有的软件
    就表示换行
    */
        try {
          writer = new FileWriter("F:\demo.txt",true);
          writer.write("
    world");
          writer.flush();
        } catch (Exception e) {
          System.out.println(e.toString());
        } finally {
          try {
             if (writer != null)
               writer.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
        }
      }
    }

    结果:

    在文件中续写了,并且换行了

    3. FileReader

    读取文件,当读取文件的时候,必须指定文件的路径,如果路径不正确,那么会报异常,有i自己默认额编码方式,和java的虚拟机默认的编码一样,一般是gbk。

          1. 单个读取

     

      import java.io.FileReader;
    import java.io.IOException;
     
    public class ReaderDemo {
      public static void main(String[] agrs) {
        FileReader fr = null;
        try {
          fr = new FileReader("F:\demo.txt");
          /*
           * 使用 read()单个读取文件,当读取当最后的时候返回-1,否则返回的是字符对应的ASCII码,我们要转换字符
           */
          int r = -1;
          while ((r = fr.read()) != -1) {
             System.out.print((char) r);
          }
        } catch (IOException e) {
          System.out.println(e.toString());
        } finally {
          try {
             if (fr != null)
               fr.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
        }
     
      }
    }

     
    2.     数组读取

     

    public class ReaderDemo {
      public static void main(String[] agrs) {
        FileReader fr = null;
        try {
          fr = new FileReader("F:\demo.txt");
          /*
           * 使用 read(char[] cbuf)读取的是到数组中,然后的是读取的到字符的个数,当去读到最后的返回的是-1
           */
          int len= -1;
          /*在定义数组长度的时候,一般是1024的倍数,在这个为了测试,写3*/
          char [] cs=new char[3];
          while ((len= fr.read(cs)) != -1) {
             /*在读取到字符数组的数组,转换为字符串,读取了多少字符,我们就转换多少,这个长度是不固定的
              * 如果固定的话,那么读取出来的会多的,例如:
              * 文件中的字符是abcdefg
              * 第一次读取:abc   数组中的信息是: a b c
              * 第二次读取:def   数组中的信息是: d e f
              * 第三次读取:g     数组中的信息是: g e f
              * 但是第三次返回的长度是1.所以我们值把g转换为字符串即可
              * */
             System.out.print(new String(cs,0,len));
          }
        } catch (IOException e) {
          System.out.println(e.toString());
        } finally {
          try {
             if (fr != null)
               fr.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
        }
     
      }
    }


    4. 文件复制

         思路:

            定义两个流:读和写,分别指向文件要读取的文件和复制到的文件地址,可以边读取变写入到另一个文件中,也可以都读取出来,然后一起写入到另一个文件。

          1.单个复制

       

     import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
     
    public class ReaderDemo {
      public static void main(String[] agrs) {
        FileWriter fw = null;
        FileReader fr = null;
        try {
          fr = new FileReader("F:\A\demo.txt");//定义读取对象,读取要复制的文件
          fw = new FileWriter("F:\B\demo.txt");//定义写入对象,写到目的文件
          int r = -1;
          while ((r = fr.read()) != -1) {//读取
             fw.write(r);//写入
                    fw.flush();//刷新
          }
        } catch (IOException e) {
          System.out.println(e.toString());
        } finally {
          try {
             if (fr != null)
               fr.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
          try {
             if (fw != null)
               fr.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
        }
     
      }
    }

         2. 数组复制

      

     import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
     
    public class ReaderDemo {
      public static void main(String[] agrs) {
        FileWriter fw = null;
        FileReader fr = null;
        try {
          fr = new FileReader("F:\A\demo.txt");// 定义读取对象,读取要复制的文件
          fw = new FileWriter("F:\B\demo.txt");// 定义写入对象,写到目的文件
          int len = -1;
          char[] cs = new char[1024];//字符数组
          while ((len = fr.read(cs)) != -1) {// 读取
             fw.write(cs,0, len);// 写入
             fw.flush();// 刷新
          }
        } catch (IOExceptione) {
          System.out.println(e.toString());
        } finally {
          try {
             if (fr != null)
               fr.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
          try {
             if (fw != null)
               fr.close();
          } catch (IOException e) {
             e.printStackTrace();
          }
        }
     
      }
    }

    --------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------------------


  • 相关阅读:
    s2-032批量脚本
    javascript 1
    threading模块和queue模块实现程序并发功能和消息队列
    Python标准库06 子进程 (subprocess包)
    常用服务对应的正则
    re
    requests
    198. 打家劫舍
    746. 使用最小花费爬楼梯
    70. 爬楼梯
  • 原文地址:https://www.cnblogs.com/riskyer/p/3347816.html
Copyright © 2020-2023  润新知